aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzhanyong.wan <zhanyong.wan@861a406c-534a-0410-8894-cb66d6ee9925>2009-06-11 03:33:05 +0000
committerzhanyong.wan <zhanyong.wan@861a406c-534a-0410-8894-cb66d6ee9925>2009-06-11 03:33:05 +0000
commit683f431d830dea27069e7eef11d355bae2b82b72 (patch)
tree002f2a1b5dd8ca41ff71134b966ed80cbfec5eee
parentb24b49d85a741f254cbe42da36e0cb93f0b0b57f (diff)
downloadgoogletest-683f431d830dea27069e7eef11d355bae2b82b72.tar.gz
googletest-683f431d830dea27069e7eef11d355bae2b82b72.tar.bz2
googletest-683f431d830dea27069e7eef11d355bae2b82b72.zip
Works around a gcc bug when compiling tr1/tuple with RTTI disabled.
-rw-r--r--Makefile.am8
-rw-r--r--include/gtest/internal/gtest-port.h14
-rw-r--r--scons/SConscript37
3 files changed, 52 insertions, 7 deletions
diff --git a/Makefile.am b/Makefile.am
index b030cd83..148a0765 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -292,6 +292,14 @@ check_PROGRAMS += test/gtest_unittest
test_gtest_unittest_SOURCES = test/gtest_unittest.cc
test_gtest_unittest_LDADD = lib/libgtest_main.la
+# Verifies that Google Test works when RTTI is disabled.
+TESTS += test/gtest_no_rtti_test
+check_PROGRAMS += test/gtest_no_rtti_test
+test_gtest_no_rtti_test_SOURCES = test/gtest_unittest.cc \
+ src/gtest-all.cc \
+ src/gtest_main.cc
+test_gtest_no_rtti_test_CXXFLAGS = $(AM_CXXFLAGS) -fno-rtti -DGTEST_HAS_RTTI=0
+
# The following tests depend on the presence of a Python installation and are
# keyed off of it. TODO(chandlerc@google.com): While we currently only attempt
# to build and execute these tests if Autoconf has found Python v2.4 on the
diff --git a/include/gtest/internal/gtest-port.h b/include/gtest/internal/gtest-port.h
index 1b573e4c..e6b9d145 100644
--- a/include/gtest/internal/gtest-port.h
+++ b/include/gtest/internal/gtest-port.h
@@ -379,7 +379,21 @@
#elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header. This does
// not conform to the TR1 spec, which requires the header to be <tuple>.
+
+#if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
+// which is #included by <tr1/tuple>, to not compile when RTTI is
+// disabled. _TR1_FUNCTIONAL is the header guard for
+// <tr1/functional>. Hence the following #define is a hack to prevent
+// <tr1/functional> from being included.
+#define _TR1_FUNCTIONAL 1
+#include <tr1/tuple>
+#undef _TR1_FUNCTIONAL // Allows the user to #include
+ // <tr1/functional> if he chooses to.
+#else
#include <tr1/tuple>
+#endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+
#else
// If the compiler is not GCC 4.0+, we assume the user is using a
// spec-conforming TR1 implementation.
diff --git a/scons/SConscript b/scons/SConscript
index 21b5ab5a..c409dcb2 100644
--- a/scons/SConscript
+++ b/scons/SConscript
@@ -126,6 +126,13 @@ if env_with_exceptions['PLATFORM'] == 'win32':
if '_TYPEINFO_' in cppdefines:
cppdefines.remove('_TYPEINFO_')
+env_without_rtti = env.Clone()
+if env_without_rtti['PLATFORM'] == 'win32':
+ env_without_rtti.Append(CCFLAGS = ['/GR-'])
+else:
+ env_without_rtti.Append(CCFLAGS = ['-fno-rtti'])
+ env_without_rtti.Append(CPPDEFINES = 'GTEST_HAS_RTTI=0')
+
gtest_ex_obj = env_with_exceptions.Object(target='gtest_ex',
source=gtest_source)
gtest_main_ex_obj = env_with_exceptions.Object(target='gtest_main_ex',
@@ -158,19 +165,19 @@ def ConstructSourceList(target, dir_prefix, additional_sources=None):
source += additional_sources
return source
-def GtestBinary(env, target, gtest_lib, sources):
+def GtestBinary(env, target, gtest_libs, sources):
"""Helper to create gtest binaries: tests, samples, etc.
Args:
env: The SCons construction environment to use to build.
target: The basename of the target's main source file, also used as target
name.
- gtest_lib: The gtest lib to use.
+ gtest_libs: A list of gtest libraries to use.
sources: A list of source files in the target.
"""
- unit_test = env.Program(target=target, source=sources, LIBS=[gtest_lib])
+ binary = env.Program(target=target, source=sources, LIBS=gtest_libs)
if 'EXE_OUTPUT' in env.Dictionary():
- env.Install('$EXE_OUTPUT', source=[unit_test])
+ env.Install('$EXE_OUTPUT', source=[binary])
def GtestUnitTest(env, target, gtest_lib, additional_sources=None):
"""Helper to create gtest unit tests.
@@ -183,7 +190,7 @@ def GtestUnitTest(env, target, gtest_lib, additional_sources=None):
"""
GtestBinary(env,
target,
- gtest_lib,
+ [gtest_lib],
ConstructSourceList(target, "../test",
additional_sources=additional_sources))
@@ -232,9 +239,25 @@ gtest_unittest_ex_obj = env_with_exceptions.Object(
source='../test/gtest_unittest.cc')
GtestBinary(env_with_exceptions,
'gtest_ex_unittest',
- gtest_ex_main,
+ [gtest_ex_main],
gtest_unittest_ex_obj)
+gtest_unittest_no_rtti_obj = env_without_rtti.Object(
+ target='gtest_unittest_no_rtti',
+ source='../test/gtest_unittest.cc')
+gtest_all_no_rtti_obj = env_without_rtti.Object(
+ target='gtest_all_no_rtti',
+ source='../src/gtest-all.cc')
+gtest_main_no_rtti_obj = env_without_rtti.Object(
+ target='gtest_main_no_rtti',
+ source='../src/gtest_main.cc')
+GtestBinary(env_without_rtti,
+ 'gtest_no_rtti_test',
+ [],
+ gtest_unittest_no_rtti_obj +
+ gtest_all_no_rtti_obj +
+ gtest_main_no_rtti_obj)
+
# We need to disable some optimization flags for some tests on
# Windows; otherwise the redirection of stdout does not work
# (apparently because of a compiler bug).
@@ -258,7 +281,7 @@ def GtestSample(env, target, gtest_lib, additional_sources=None):
"""
GtestBinary(env,
target,
- gtest_lib,
+ [gtest_lib],
ConstructSourceList(target, "../samples",
additional_sources=additional_sources))