gcc 4.7 regression on bool function specialization

Jason A. Donenfeld Jason@zx2c4.com
Sat Jan 19 18:58:00 GMT 2013


/*
 *
 * The output of this with gcc 4.7.2 is:
 *
 * 1
 * 2
 * this generic-int function should not be called
 * 0
 *
 *
 *
 * The output of this with gcc 4.6.3 is:
 *
 * 1
 * 2
 * this type-bool function SHOULD BE called
 * 1
 *
 */

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstring>

struct Type { int dummy; };

template <typename T, typename M>
inline T extractTag(const M &map, const char *key)
{
	if (!strcmp(key, "blah-bool"))
		std::cout << "this generic-int function should not be called" << std::endl;
	T ret = 0;
	std::istringstream stream(extractTag<std::string>(map, key));
	stream >> ret;
	return ret;
}
template <typename M>
inline bool extractTag(const M &map, const char *key)
{
	if (!strcmp(key, "blah-bool"))
		std::cout << "this generic-bool function should not be called" << std::endl;
	std::string str(extractTag<std::string>(map, key));
	std::transform(str.begin(), str.end(), str.begin(), ::tolower);
	return (str == "1" || str == "true");
}
template <>
inline unsigned int extractTag(const Type&, const char *key)
{
	return 2;
}
template <>
inline std::string extractTag(const Type&, const char *key)
{
	if (!strcmp(key, "blah-int"))
		return "1";
	if (!strcmp(key, "blah-unsigned-int"))
		return "-should-not-be-reached-";
	if (!strcmp(key, "blah-bool"))
		return "true";
	return "invalid";
}
template <>
inline bool extractTag(const Type&, const char *key)
{
	if (!strcmp(key, "blah-bool"))
		std::cout << "this type-bool function SHOULD BE called" << std::endl;
	return true;
}

int main(int argc, char *argv[])
{
	Type t;
	std::cout << extractTag<int>(t, "blah-int") << std::endl;
	std::cout << extractTag<unsigned int>(t, "blah-unsigned-int") << std::endl;
	std::cout << extractTag<bool>(t, "blah-bool") << std::endl;
	return 0;
}



More information about the Gcc mailing list