Bug 206335

Summary: clang++ -x c++ issue : expected unqualified-id
Product: Base System Reporter: DW <dweber>
Component: binAssignee: freebsd-bugs (Nobody) <bugs>
Status: New ---    
Severity: Affects Only Me CC: dweber
Priority: ---    
Version: 10.2-STABLE   
Hardware: Any   
OS: Any   
URL: http://www-crypto.htw-saarland.de/weber/download/freebsd_clang_x_cpp_oKr6RiMc/
Description Flags
tar file containing sources showing the bug via "make" none

Description DW 2016-01-17 14:37:52 UTC

Comment 1 DW 2016-01-17 14:43:39 UTC
Created attachment 165715 [details]
tar file containing sources showing the bug via "make"

tar file

Comment 2 DW 2016-01-17 14:45:33 UTC
Seems I have found a clang++ bug if called with -x c++.

    system is FreeBSD 10.2-STABLE (TESTBOX) #0 r290820M
    compiler is clang 3.4.1, in particular

      $ clang++ -v
      FreeBSD clang version 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512
      Target: x86_64-unknown-freebsd10.2
      Thread model: posix
      Selected GCC installation: 

    compiler clang 3.6 from ports also affected
    compiler clang 3.7 to be checked 

To reproduce

    download clang_x_cpp_bug.tar
    tar xf clang_x_cpp_bug.tar
    cd clang_x_cpp_bug
Comment 3 Hubert Drogosz 2016-02-21 13:08:29 UTC
It seems to me that it isn't a bug. For me clang does what it should do. 
Taking from clang man page:

-x <language>

    Treat subsequent input files as having type language.

So for me it means that it should treat every file after -x option as file of this type.
As you're passing object file (test-function.o) after -x c++ option, it tries to interpret this file like c++ source file, and it fails. 
I think you should compile it this way:

    clang++ -o test-x_cpp test-function.o -x c++ test-x_cpp.c

Unfortunately, there isn't an option to pass object file after using -x option, so object files should be passed before using any -x option.
Comment 4 DW 2016-02-21 15:19:38 UTC
(In reply to Hubert Drogosz from comment #3)

Yes, makes sense. Thank you.

The error message is misleading at first, though, but (with hindsight) makes sense, too.

:: test-function.o:1:1: error: expected unqualified-id
:: ELF 
:: ^
:: test-function.o:1:9: warning: null character ignored [-Wnull-character]
:: ELF 

Far more obvious would be an error message like this:

:: test-function.o: not a C++ source file, aborting