Compile with -std=c++03 consistently on all platforms. By default, Clang 3.2 inconsistently uses C++11 for Windows and C++03 for Linux if user did not specify -std= on the command line. Fixes other.test_embind and *.test_llvmswitch. Add unit tests that confirm that .cpp files are compiled with C++03 std by default.
This commit is contained in:
Родитель
c40babef1f
Коммит
9dd7e94ecd
14
emcc
14
emcc
|
@ -596,6 +596,10 @@ try:
|
|||
keep_debug = False
|
||||
bind = False
|
||||
jcache = False
|
||||
if use_cxx:
|
||||
default_cxx_std = '-std=c++03' # Enforce a consistent C++ standard when compiling .cpp files, if user does not specify one on the cmdline.
|
||||
else:
|
||||
default_cxx_std = '' # Compiling C code with .c files, don't enforce a default C++ std.
|
||||
|
||||
def check_bad_eq(arg):
|
||||
assert '=' not in arg, 'Invalid parameter (do not use "=" with "--" options)'
|
||||
|
@ -659,7 +663,11 @@ try:
|
|||
keep_debug = True
|
||||
elif newargs[i] == '--bind':
|
||||
bind = True
|
||||
newargs[i] = '-std=c++11' # Force C++11 for embind code
|
||||
newargs[i] = ''
|
||||
if default_cxx_std:
|
||||
default_cxx_std = '-std=c++11' # Force C++11 for embind code, but only if user has not explicitly overridden a standard.
|
||||
elif newargs[i].startswith('-std='):
|
||||
default_cxx_std = '' # User specified a standard to use, clear Emscripten from specifying it.
|
||||
elif newargs[i].startswith('--embed-file'):
|
||||
check_bad_eq(newargs[i])
|
||||
embed_files.append(newargs[i+1])
|
||||
|
@ -717,6 +725,10 @@ try:
|
|||
absolute_warning_shown = True
|
||||
newargs = [ arg for arg in newargs if arg is not '' ]
|
||||
|
||||
# If user did not specify a default -std for C++ code, specify the emscripten default.
|
||||
if default_cxx_std:
|
||||
newargs = newargs + [default_cxx_std]
|
||||
|
||||
if llvm_opts is None: llvm_opts = LLVM_OPT_LEVEL[opt_level]
|
||||
if llvm_lto is None: llvm_lto = llvm_opts > 0
|
||||
if closure is None: closure = 1 if opt_level >= 2 else 0
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#if __cplusplus != 199711L
|
||||
#error By default, if no -std is specified, emscripten should be compiling with -std=c++03!
|
||||
#endif
|
||||
|
||||
int main( int argc, const char *argv[] ) {
|
||||
printf("Hello world!\\n");
|
||||
return 0;
|
||||
}
|
|
@ -238,7 +238,7 @@ process(sys.argv[1])
|
|||
os.remove(f + '.o')
|
||||
except:
|
||||
pass
|
||||
args = [Building.COMPILER, '-emit-llvm'] + COMPILER_OPTS + Building.COMPILER_TEST_OPTS + \
|
||||
args = [Building.COMPILER, '-emit-llvm', '-std=c++03'] + COMPILER_OPTS + Building.COMPILER_TEST_OPTS + \
|
||||
['-I', dirname, '-I', os.path.join(dirname, 'include')] + \
|
||||
map(lambda include: '-I' + include, includes) + \
|
||||
['-c', f, '-o', f + '.o']
|
||||
|
@ -3517,7 +3517,7 @@ def process(filename):
|
|||
# i.e. as if "-std=c++03" had been passed on the command line. On Linux with Clang 3.2 this is the case, but on Windows
|
||||
# with Clang 3.2 -std=c++11 has been chosen as default, because of
|
||||
# < jrose> clb: it's deliberate, with the idea that for people who don't care about the standard, they should be using the "best" thing we can offer on that platform
|
||||
def test_cxx03(self):
|
||||
def test_cxx03_do_run(self):
|
||||
src = '''
|
||||
#include <stdio.h>
|
||||
|
||||
|
@ -8406,6 +8406,12 @@ f.close()
|
|||
assert process.returncode is not 0, 'Trying to compile a nonexisting file should return with a nonzero error code!'
|
||||
assert os.path.exists('this_output_file_should_never_exist.js') == False, 'Emcc should not produce an output file when build fails!'
|
||||
|
||||
def test_cxx03(self):
|
||||
for compiler in [EMCC, EMXX]:
|
||||
process = Popen([PYTHON, compiler, path_from_root('tests', 'hello_cxx03.cpp')], stdout=PIPE, stderr=PIPE)
|
||||
process.communicate()
|
||||
assert process.returncode is 0, 'By default, emscripten should build using -std=c++03!'
|
||||
|
||||
def test_Os(self):
|
||||
for opt in ['s', '0']:
|
||||
output = Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world.c'), '-O' + opt], stdout=PIPE, stderr=PIPE).communicate()
|
||||
|
|
Загрузка…
Ссылка в новой задаче