Home | History | Annotate | Download | only in docs
      1 .. raw:: html
      2 
      3   <style type="text/css">
      4     .none { background-color: #FFCCCC }
      5     .partial { background-color: #FFFF99 }
      6     .good { background-color: #CCFF99 }
      7   </style>
      8 
      9 .. role:: none
     10 .. role:: partial
     11 .. role:: good
     12 
     13 ==================
     14 MSVC compatibility
     15 ==================
     16 
     17 When Clang compiles C++ code for Windows, it attempts to be compatible with
     18 MSVC.  There are multiple dimensions to compatibility.
     19 
     20 First, Clang attempts to be ABI-compatible, meaning that Clang-compiled code
     21 should be able to link against MSVC-compiled code successfully.  However, C++
     22 ABIs are particularly large and complicated, and Clang's support for MSVC's C++
     23 ABI is a work in progress.  If you don't require MSVC ABI compatibility or don't
     24 want to use Microsoft's C and C++ runtimes, the mingw32 toolchain might be a
     25 better fit for your project.
     26 
     27 Second, Clang implements many MSVC language extensions, such as
     28 ``__declspec(dllexport)`` and a handful of pragmas.  These are typically
     29 controlled by ``-fms-extensions``.
     30 
     31 Third, MSVC accepts some C++ code that Clang will typically diagnose as
     32 invalid.  When these constructs are present in widely included system headers,
     33 Clang attempts to recover and continue compiling the user's program.  Most
     34 parsing and semantic compatibility tweaks are controlled by
     35 ``-fms-compatibility`` and ``-fdelayed-template-parsing``, and they are a work
     36 in progress.
     37 
     38 Finally, there is :ref:`clang-cl`, a driver program for clang that attempts to
     39 be compatible with MSVC's cl.exe.
     40 
     41 ABI features
     42 ============
     43 
     44 The status of major ABI-impacting C++ features:
     45 
     46 * Record layout: :good:`Complete`.  We've tested this with a fuzzer and have
     47   fixed all known bugs.
     48 
     49 * Class inheritance: :good:`Mostly complete`.  This covers all of the standard
     50   OO features you would expect: virtual method inheritance, multiple
     51   inheritance, and virtual inheritance.  Every so often we uncover a bug where
     52   our tables are incompatible, but this is pretty well in hand.  This feature
     53   has also been fuzz tested.
     54 
     55 * Name mangling: :good:`Ongoing`.  Every new C++ feature generally needs its own
     56   mangling.  For example, member pointer template arguments have an interesting
     57   and distinct mangling.  Fortunately, incorrect manglings usually do not result
     58   in runtime errors.  Non-inline functions with incorrect manglings usually
     59   result in link errors, which are relatively easy to diagnose.  Incorrect
     60   manglings for inline functions and templates result in multiple copies in the
     61   final image.  The C++ standard requires that those addresses be equal, but few
     62   programs rely on this.
     63 
     64 * Member pointers: :good:`Mostly complete`.  Standard C++ member pointers are
     65   fully implemented and should be ABI compatible.  Both `#pragma
     66   pointers_to_members`_ and the `/vm`_ flags are supported. However, MSVC
     67   supports an extension to allow creating a `pointer to a member of a virtual
     68   base class`_.  Clang does not yet support this.
     69 
     70 .. _#pragma pointers_to_members:
     71   http://msdn.microsoft.com/en-us/library/83cch5a6.aspx
     72 .. _/vm: http://msdn.microsoft.com/en-us/library/yad46a6z.aspx
     73 .. _pointer to a member of a virtual base class: http://llvm.org/PR15713
     74 
     75 * Debug info: :partial:`Minimal`.  Clang emits both CodeView line tables
     76   (similar to what MSVC emits when given the ``/Z7`` flag) and DWARF debug
     77   information into the object file.
     78   Microsoft's link.exe will transform the CodeView line tables into a PDB,
     79   enabling stack traces in all modern Windows debuggers.  Clang does not emit
     80   any CodeView-compatible type info or description of variable layout.
     81   Binaries linked with either binutils' ld or LLVM's lld should be usable with
     82   GDB however sophisticated C++ expressions are likely to fail.
     83 
     84 * RTTI: :good:`Complete`.  Generation of RTTI data structures has been
     85   finished, along with support for the ``/GR`` flag.
     86 
     87 * C++ Exceptions: :good:`Mostly complete`.  Support for
     88   C++ exceptions (``try`` / ``catch`` / ``throw``) have been implemented for
     89   x86 and x64.  Our implementation has been well tested but we still get the
     90   odd bug report now and again.
     91   C++ exception specifications are ignored, but this is `consistent with Visual
     92   C++`_.
     93 
     94 .. _consistent with Visual C++:
     95   https://msdn.microsoft.com/en-us/library/wfa0edys.aspx
     96 
     97 * Asynchronous Exceptions (SEH): :partial:`Partial`.
     98   Structured exceptions (``__try`` / ``__except`` / ``__finally``) mostly
     99   work on x86 and x64.
    100   LLVM does not model asynchronous exceptions, so it is currently impossible to
    101   catch an asynchronous exception generated in the same frame as the catching
    102   ``__try``.
    103 
    104 * Thread-safe initialization of local statics: :good:`Complete`.  MSVC 2015
    105   added support for thread-safe initialization of such variables by taking an
    106   ABI break.
    107   We are ABI compatible with both the MSVC 2013 and 2015 ABI for static local
    108   variables.
    109 
    110 * Lambdas: :good:`Mostly complete`.  Clang is compatible with Microsoft's
    111   implementation of lambdas except for providing overloads for conversion to
    112   function pointer for different calling conventions.  However, Microsoft's
    113   extension is non-conforming.
    114 
    115 Template instantiation and name lookup
    116 ======================================
    117 
    118 MSVC allows many invalid constructs in class templates that Clang has
    119 historically rejected.  In order to parse widely distributed headers for
    120 libraries such as the Active Template Library (ATL) and Windows Runtime Library
    121 (WRL), some template rules have been relaxed or extended in Clang on Windows.
    122 
    123 The first major semantic difference is that MSVC appears to defer all parsing
    124 an analysis of inline method bodies in class templates until instantiation
    125 time.  By default on Windows, Clang attempts to follow suit.  This behavior is
    126 controlled by the ``-fdelayed-template-parsing`` flag.  While Clang delays
    127 parsing of method bodies, it still parses the bodies *before* template argument
    128 substitution, which is not what MSVC does.  The following compatibility tweaks
    129 are necessary to parse the template in those cases.
    130 
    131 MSVC allows some name lookup into dependent base classes.  Even on other
    132 platforms, this has been a `frequently asked question`_ for Clang users.  A
    133 dependent base class is a base class that depends on the value of a template
    134 parameter.  Clang cannot see any of the names inside dependent bases while it
    135 is parsing your template, so the user is sometimes required to use the
    136 ``typename`` keyword to assist the parser.  On Windows, Clang attempts to
    137 follow the normal lookup rules, but if lookup fails, it will assume that the
    138 user intended to find the name in a dependent base.  While parsing the
    139 following program, Clang will recover as if the user had written the
    140 commented-out code:
    141 
    142 .. _frequently asked question:
    143   http://clang.llvm.org/compatibility.html#dep_lookup
    144 
    145 .. code-block:: c++
    146 
    147   template <typename T>
    148   struct Foo : T {
    149     void f() {
    150       /*typename*/ T::UnknownType x =  /*this->*/unknownMember;
    151     }
    152   };
    153 
    154 After recovery, Clang warns the user that this code is non-standard and issues
    155 a hint suggesting how to fix the problem.
    156 
    157 As of this writing, Clang is able to compile a simple ATL hello world
    158 application.  There are still issues parsing WRL headers for modern Windows 8
    159 apps, but they should be addressed soon.
    160