Bug #28184 min() and max() macro defines in my_global.h conflict with c++ headers
| Submitted: | 1 May 2007 18:26 | Modified: | 27 Nov 2007 19:11 |
|---|---|---|---|
| Reporter: | Arkadiusz Miskiewicz (Basic Quality Contributor) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Compiling | Severity: | S3 (Non-critical) |
| Version: | 5.1.17, 5.0.37,6.0 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | Contribution, qc | ||
[1 May 2007 19:00]
Valeriy Kravchuk
Thank you for a problem report. Verified just as described with code review.
[10 Jul 2007 7:32]
Arkadiusz Miskiewicz
Replaces min() max() with mysql_min() and mysql_max()
Attachment: mysql-min_max.patch (application/octet-stream, text), 142.99 KiB.
[10 Jul 2007 7:33]
Arkadiusz Miskiewicz
Compile tested. Replaces all (hope that I didn't miss anything in code that's not compiled in by default) occurences of min() and max() with non-conflicting mysql_min() and mysql_max(). Please review and merge since the bug is annoying for anyone using recent compiler (note, gcc 4.2.0 was already released some time ago).
[10 Jul 2007 21:42]
Sergei Golubchik
see also http://lists.mysql.com/internals/34680 and references therein
[11 Jul 2007 13:09]
Arkadiusz Miskiewicz
Uppercasing to indicate that these are macros is a good idea. So after applying my patch:
find . -type f -exec sed -i -e 's|mysql_min|MYSQL_MIN|g' -e 's|mysql_max|MYSQL_MAX|g' '{}' ';'
[23 Jul 2007 13:04]
Paul DuBois
This occurs now on Gentoo Linux, for which a 4.2.0 ebuild has been released recently. % gcc --version gcc (GCC) 4.2.0 (Gentoo 4.2.0 p1.4) Affects the 5.1, 5.1-falcon, and 5.2 bk trees.
[12 Nov 2007 17:28]
Hartmut Holzgraefe
Also affects Debian "testing" and "unstable" as both have gcc 4.2.x as default compiler now (probably also some Ubuntu versions?)
[12 Nov 2007 17:44]
Arkadiusz Miskiewicz
We use smaller version mentioned earlier in commeents: http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/~checkout~/SOURCES/mysql-min_max.patch?rev=1.6... Works.
[23 Nov 2007 13:30]
Hartmut Holzgraefe
Fixed by http://mysql.bkbits.net:8080/mysql-5.1/?PAGE=cset&REV=46dbec1c1lAGFuqFZQy58XVe4KSijg
[26 Nov 2007 18:28]
Paul DuBois
Noted in 5.1.23, 6.0.4 changelogs. MySQL now can be compiled with gcc 4.2.x. There was a problem involving a conflict with the min() and max() macros in my_global.h, which now have been renamed to mysql_min() and mysql_max().
[26 Nov 2007 19:21]
Sergei Golubchik
No, they weren't renamed, see the patch at the link
[27 Nov 2007 19:11]
Paul DuBois
Removed the "which have been renamed" part from the changelog entry.
[1 May 2013 17:06]
Jon Baker
Is this still fixed? I'm running into this issue using mysql-devel-5.5-1.3
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.046 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: my_global.h contains: #if !defined(max) #define max(a, b) ((a) > (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b)) #endif which are highly problematic when building with upcoming gcc 4.2.0 because: x86_64-pld-linux-g++ -DUNDEF_THREADS_HACK -DDEFAULT_MYSQL_HOME="\"/usr\"" -DDATADIR="\"/var/lib/mysql\"" -I. -I.. -I../include -I../include -I../regex -O2 -fno-strict-aliasing -fwrapv -march=x86-64 -gdwarf-2 -g2 -felide-constructors -fno-rtti -fno-exceptions -fomit-frame-pointer -fno-implicit-templates -fno-exceptions -fno-rtti -MT mysqladmin.o -MD -MP -MF .deps/mysqladmin.Tpo -c -o mysqladmin.o mysqladmin.cc sql_string.cc: In member function 'int String::reserve(uint32, uint32)': sql_string.cc:665: error: 'max' was not declared in this scope sql_string.cc: In function 'int stringcmp(const String*, const String*)': sql_string.cc:751: error: 'min' was not declared in this scope sql_string.cc: In function 'String* copy_if_not_alloced(String*, String*, uint32)': sql_string.cc:768: error: 'min' was not declared in this scope and that's because /usr/include/c++/4.2.0/limits contains: template<typename _Tp> struct numeric_limits : public __numeric_limits_base { /** The minimum finite value, or for floating types with denormalization, the minimum positive normalized value. */ static _Tp min() throw() { return static_cast<_Tp>(0); } /** The maximum finite value. */ static _Tp max() throw() { return static_cast<_Tp>(0); } How to repeat: build mysql 5.1.17 with gcc 4.2.0rc1 Suggested fix: Change names of macros from min to mysql_min and max to mysql_max. Workaround patch: http://cvs.pld-linux.org/cgi-bin/cvsweb/SOURCES/mysql-min_max.patch?rev=1.2 but clean solution is to rename these everywhere in source code.