Fix compilation of .c files as C++ when using Clang
authorGary Benson <gbenson@redhat.com>
Fri, 25 Sep 2020 13:29:35 +0000 (14:29 +0100)
committerGary Benson <gbenson@redhat.com>
Fri, 25 Sep 2020 13:29:35 +0000 (14:29 +0100)
In commit 221db974e653659edb280787af1b3efdd1615083, this patch:

    2020-06-24  Pedro Alves  <palves@redhat.com>

    * lib/gdb.exp (gdb_compile): Pass "-x c++" explicitly when
    compiling C++ programs.

attempted to fix problems with testcases that compile .c files
with the C++ compiler.  They pass the "c++" option to gdb_compile,
resulting in the following error when using Clang:

    gdb compile failed, clang-10: warning: treating 'c' input as 'c++'
    when in C++ mode, this behavior is deprecated [-Wdeprecated]

This fix did not work for gdb.base/infcall-nested-structs-c++.exp,
however: the "-x c++" appeared in the compiler's commandline after
the .c file, so the option was not enabled for that file.

The previous files fixed all used build_executable_from_specs, which
compiles and links in separate steps, using gdb_compile: the compile
step passes $type=object to gdb_compile, while the link step passes
$type=executable.

gdb.base/infcall-nested-structs-c++.exp uses gdb_compile directly
instead, and it passes $type=executable to compile and link all in
one step.  Pedro found that DejaGnu's default_target_compile adds
the sources at the end when $type=object, but at the beginning when
$type=executable:

    # This is obscure: we put SOURCES at the end when building an
    # object, because otherwise, in some situations, libtool will
    # become confused about the name of the actual source file.
    if {$type == "object"} {
        set opts "$add_flags $sources"
    } else {
        set opts "$sources $add_flags"
    }

This commit moves the "-x c++" earlier in the compiler's commandline.
Unfortunately this then broke the testcase that required the original
fix, gdb.compile/compile-cplus.exp: the "-x c++" was being parsed for
the linker pass, causing the compiler to attempt to parse the .o files
as C++.  This commit makes passing "-x c++" conditional on the source
being a .c file.

gdb/testsuite/ChangeLog:

* lib/gdb.exp (gdb_compile): Pass "-x c++" earlier, and only
for .c files.

gdb/testsuite/ChangeLog
gdb/testsuite/lib/gdb.exp

index 41849756f973dd9b6e6e7323a6da81b1194dc5ff..a19af885d39da7e7a9edce1d58ef06fe8ec86d2a 100644 (file)
@@ -1,3 +1,8 @@
+2020-09-25  Gary Benson <gbenson@redhat.com>
+
+       * lib/gdb.exp (gdb_compile): Pass "-x c++" earlier, and only
+       for .c files.
+
 2020-09-24  Tom Tromey  <tromey@adacore.com>
 
        PR tui/26638:
index 59439f8e37975acffb006e07e738ab73ec2183e1..608469953bf3af2dc5ba57affd64d30c4ce3b351 100644 (file)
@@ -3944,8 +3944,9 @@ proc gdb_compile {source dest type options} {
     # explicitly force C++ language.
     if { [lsearch -exact $options getting_compiler_info] == -1
         && [lsearch -exact $options c++] != -1
-        && [test_compiler_info "clang-*"]} {
-       lappend new_options additional_flags=-x\ c++
+        && [string match *.c $source] != 0
+        && [test_compiler_info "clang-*"] } {
+       lappend new_options early_flags=-x\ c++
     }
 
     # Place (and look for) Fortran `.mod` files in the output