gdb: Fix std::{min, max}-related build breakage on 32-bit hosts

Building on a 32-bit host fails currently with errors like:

  .../src/gdb/exec.c: In function ‘target_xfer_status section_table_read_available_memory(gdb_byte*, ULONGEST, ULONGEST, ULONGEST*)’:
  .../src/gdb/exec.c:801:54: error: no matching function for call to ‘min(ULONGEST, long unsigned int)’
      end = std::min (offset + len, r->start + r->length);
							^
  In file included from /usr/include/c++/5.3.1/algorithm:61:0,
		   from .../src/gdb/exec.c:46:
  /usr/include/c++/5.3.1/bits/stl_algobase.h:195:5: note: candidate: template<class _Tp> const _Tp& std::min(const _Tp&, const _Tp&)
       min(const _Tp& __a, const _Tp& __b)
       ^
  /usr/include/c++/5.3.1/bits/stl_algobase.h:195:5: note:   template argument deduction/substitution failed:
  .../src/gdb/exec.c:801:54: note:   deduced conflicting types for parameter ‘const _Tp’ (‘long long unsigned int’ and ‘long unsigned int’)
      end = std::min (offset + len, r->start + r->length);
							^
  In file included from /usr/include/c++/5.3.1/algorithm:61:0,
		   from .../src/gdb/exec.c:46:
  /usr/include/c++/5.3.1/bits/stl_algobase.h:243:5: note: candidate: template<class _Tp, class _Compare> const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
       min(const _Tp& __a, const _Tp& __b, _Compare __comp)
       ^

The problem is that the std::min/std::max function templates use the
same type for both parameters.  When the argument types are different,
the compiler can't automatically deduce which template specialization
to pick from the arguments' types.

Fix that by specifying the specialization we want explicitly.

gdb/ChangeLog:
2016-09-18  Pedro Alves  <palves@redhat.com>

	* breakpoint.c (hardware_watchpoint_inserted_in_range): Explicitly
	specify the std:min/std::max specialization.
	* exec.c (section_table_read_available_memory): Likewise.
	* remote.c (remote_read_qxfer): Likewise.
	* target.c (simple_verify_memory): Likewise.
This commit is contained in:
Pedro Alves 2016-09-18 23:56:01 +01:00
parent 498f644143
commit 768adc05c4
5 changed files with 13 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2016-09-18 Pedro Alves <palves@redhat.com>
* breakpoint.c (hardware_watchpoint_inserted_in_range): Explicitly
specify the std:min/std::max specialization.
* exec.c (section_table_read_available_memory): Likewise.
* remote.c (remote_read_qxfer): Likewise.
* target.c (simple_verify_memory): Likewise.
2016-09-16 Simon Marchi <simark@simark.ca>
* infrun.c (restore_current_uiout_cleanup): Move to ui-out.c.

View File

@ -4436,8 +4436,8 @@ hardware_watchpoint_inserted_in_range (struct address_space *aspace,
CORE_ADDR l, h;
/* Check for intersection. */
l = std::max (loc->address, addr);
h = std::min (loc->address + loc->length, addr + len);
l = std::max<CORE_ADDR> (loc->address, addr);
h = std::min<CORE_ADDR> (loc->address + loc->length, addr + len);
if (l < h)
return 1;
}

View File

@ -798,7 +798,7 @@ section_table_read_available_memory (gdb_byte *readbuf, ULONGEST offset,
enum target_xfer_status status;
/* Get the intersection window. */
end = std::min (offset + len, r->start + r->length);
end = std::min<CORE_ADDR> (offset + len, r->start + r->length);
gdb_assert (end - offset <= len);

View File

@ -9907,7 +9907,7 @@ remote_read_qxfer (struct target_ops *ops, const char *object_name,
may not, since we don't know how much of it will need to be escaped;
the target is free to respond with slightly less data. We subtract
five to account for the response type and the protocol frame. */
n = std::min (get_remote_packet_size () - 5, len);
n = std::min<LONGEST> (get_remote_packet_size () - 5, len);
snprintf (rs->buf, get_remote_packet_size () - 4, "qXfer:%s:read:%s:%s,%s",
object_name, annex ? annex : "",
phex_nz (offset, sizeof offset),

View File

@ -3585,7 +3585,7 @@ simple_verify_memory (struct target_ops *ops,
ULONGEST xfered_len;
enum target_xfer_status status;
gdb_byte buf[1024];
ULONGEST howmuch = std::min (sizeof (buf), size - total_xfered);
ULONGEST howmuch = std::min<ULONGEST> (sizeof (buf), size - total_xfered);
status = target_xfer_partial (ops, TARGET_OBJECT_MEMORY, NULL,
buf, NULL, lma + total_xfered, howmuch,