<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
          "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  <title>Language Compatibility</title>
  <link type="text/css" rel="stylesheet" href="menu.css">
  <link type="text/css" rel="stylesheet" href="content.css">
  <style type="text/css">
</style>
</head>
<body>

<!--#include virtual="menu.html.incl"-->

<div id="content">

<!-- ======================================================================= -->
<h1>Language Compatibility</h1>
<!-- ======================================================================= -->

<p>Clang strives to both conform to current language standards (C99,
  C++98) and also to implement many widely-used extensions available
  in other compilers, so that most correct code will "just work" when
  compiler with Clang. However, Clang is more strict than other
  popular compilers, and may reject incorrect code that other
  compilers allow. This page documents common compatibility and
  portability issues with Clang to help you understand and fix the
  problem in your code when Clang emits an error message.</p>
  
<ul>
  <li><a href="#c">C compatibility</a>
    <ul>
      <li><a href="#inline">C99 inline functions</a></li>
      <li><a href="#vector_builtins">"missing" vector __builtin functions</a></li>
      <li><a href="#lvalue-cast">Lvalue casts</a></li>
      <li><a href="#blocks-in-protected-scope">Jumps to within <tt>__block</tt> variable scope</a></li>
      <li><a href="#block-variable-initialization">Non-initialization of <tt>__block</tt> variables</a></li>
      <li><a href="#inline-asm">Inline assembly</a></li>
    </ul>
  </li>
  <li><a href="#objective-c">Objective-C compatibility</a>
    <ul>
      <li><a href="#super-cast">Cast of super</a></li>
      <li><a href="#sizeof-interface">Size of interfaces</a></li>
      <li><a href="#objc_objs-cast">Internal Objective-C types</a></li>
      <li><a href="#c_variables-class">C variables in @class or @protocol</a></li>
    </ul>
  </li>
  <li><a href="#cxx">C++ compatibility</a>
    <ul>
      <li><a href="#vla">Variable-length arrays</a></li>
      <li><a href="#dep_lookup">Unqualified lookup in templates</a></li>
      <li><a href="#dep_lookup_bases">Unqualified lookup into dependent bases of class templates</a></li>
      <li><a href="#undep_incomplete">Incomplete types in templates</a></li>
      <li><a href="#bad_templates">Templates with no valid instantiations</a></li>
      <li><a href="#default_init_const">Default initialization of const
      variable of a class type requires user-defined default
      constructor</a></li>
      <li><a href="#param_name_lookup">Parameter name lookup</a></li>
    </ul>
  </li>
  <li><a href="#cxx11">C++11 compatibility</a>
    <ul>
      <li><a href="#deleted-special-func">Deleted special member
  functions</a></li>
    </ul>
  </li>
  <li><a href="#objective-cxx">Objective-C++ compatibility</a>
    <ul>
      <li><a href="#implicit-downcasts">Implicit downcasts</a></li>
    </ul>
    <ul>
      <li><a href="#class-as-property-name">Using <code>class</code> as a property name</a></li>
    </ul>
  </li>
</ul>

<!-- ======================================================================= -->
<h2 id="c">C compatibility</h2>
<!-- ======================================================================= -->

<!-- ======================================================================= -->
<h3 id="inline">C99 inline functions</h3>
<!-- ======================================================================= -->
<p>By default, Clang builds C code according to the C99 standard,
which provides different semantics for the <code>inline</code> keyword
than GCC's default behavior. For example, consider the following
code:</p>
<pre>
inline int add(int i, int j) { return i + j; }

int main() {
  int i = add(4, 5);
  return i;
}
</pre>

<p>In C99, <code>inline</code> means that a function's definition is
provided only for inlining, and that there is another definition
(without <code>inline</code>) somewhere else in the program.  That
means that this program is incomplete, because if <code>add</code>
isn't inlined (for example, when compiling without optimization), then
<code>main</code> will have an unresolved reference to that other
definition.  Therefore we'll get a (correct) link-time error like this:</p>

<pre>
Undefined symbols:
  "_add", referenced from:
      _main in cc-y1jXIr.o
</pre>

<p>By contrast, GCC's default behavior follows the GNU89 dialect,
which is the C89 standard plus a lot of extensions.  C89 doesn't have
an <code>inline</code> keyword, but GCC recognizes it as an extension
and just treats it as a hint to the optimizer.</p>

<p>There are several ways to fix this problem:</p>

<ul>
  <li>Change <code>add</code> to a <code>static inline</code>
  function.  This is usually the right solution if only one
  translation unit needs to use the function.  <code>static
  inline</code> functions are always resolved within the translation
  unit, so you won't have to add a non-<code>inline</code> definition
  of the function elsewhere in your program.</li>

  <li>Remove the <code>inline</code> keyword from this definition of
  <code>add</code>.  The <code>inline</code> keyword is not required
  for a function to be inlined, nor does it guarantee that it will be.
  Some compilers ignore it completely.  Clang treats it as a mild
  suggestion from the programmer.</li>
     
  <li>Provide an external (non-<code>inline</code>) definition
  of <code>add</code> somewhere else in your program.  The two
  definitions must be equivalent!</li>

  <li>Compile with the GNU89 dialect by adding
  <code>-std=gnu89</code> to the set of Clang options. This option is
  only recommended if the program source cannot be changed or if the
  program also relies on additional C89-specific behavior that cannot
  be changed.</li>
</ul>

<p>All of this only applies to C code; the meaning of <code>inline</code>
in C++ is very different from its meaning in either GNU89 or C99.</p>

<!-- ======================================================================= -->
<h3 id="vector_builtins">"missing" vector __builtin functions</h3>
<!-- ======================================================================= -->

<p>The Intel and AMD manuals document a number "<tt>&lt;*mmintrin.h&gt;</tt>"
header files, which define a standardized API for accessing vector operations
on X86 CPUs.  These functions have names like <tt>_mm_xor_ps</tt> and
<tt>_mm256_addsub_pd</tt>.  Compilers have leeway to implement these functions
however they want.  Since Clang supports an excellent set of <a 
href="../docs/LanguageExtensions.html#vectors">native vector operations</a>,
the Clang headers implement these interfaces in terms of the native vector 
operations.
</p>

<p>In contrast, GCC implements these functions mostly as a 1-to-1 mapping to
builtin function calls, like <tt>__builtin_ia32_paddw128</tt>.  These builtin
functions are an internal implementation detail of GCC, and are not portable to
the Intel compiler, the Microsoft compiler, or Clang.  If you get build errors
mentioning these, the fix is simple: switch to the *mmintrin.h functions.</p>

<p>The same issue occurs for NEON and Altivec for the ARM and PowerPC
architectures respectively.  For these, make sure to use the &lt;arm_neon.h&gt;
and &lt;altivec.h&gt; headers.</p>

<p>For x86 architectures this <a href="builtins.py">script</a> should help with
the manual migration process.  It will rewrite your source files in place to
use the APIs instead of builtin function calls. Just call it like this:</p>

<pre>
  builtins.py *.c *.h
</pre>

<p>and it will rewrite all of the .c and .h files in the current directory to
use the API calls instead of calls like <tt>__builtin_ia32_paddw128</tt>.</p>

<!-- ======================================================================= -->
<h3 id="lvalue-cast">Lvalue casts</h3>
<!-- ======================================================================= -->

<p>Old versions of GCC permit casting the left-hand side of an assignment to a
different type. Clang produces an error on similar code, e.g.,</p>

<pre>
<b>lvalue.c:2:3: <span class="error">error:</span> assignment to cast is illegal, lvalue casts are not supported</b>
  (int*)addr = val;
<span class="caret">  ^~~~~~~~~~ ~</span>
</pre>

<p>To fix this problem, move the cast to the right-hand side. In this
example, one could use:</p>

<pre>
  addr = (float *)val;
</pre>

<!-- ======================================================================= -->
<h3 id="blocks-in-protected-scope">Jumps to within <tt>__block</tt> variable scope</h3>
<!-- ======================================================================= -->

<p>Clang disallows jumps into the scope of a <tt>__block</tt>
variable.  Variables marked with <tt>__block</tt> require special
runtime initialization. A jump into the scope of a <tt>__block</tt>
variable bypasses this initialization, leaving the variable's metadata
in an invalid state.  Consider the following code fragment:</p>

<pre>
int fetch_object_state(struct MyObject *c) {
  if (!c->active) goto error;

  __block int result;
  run_specially_somehow(^{ result = c->state; });
  return result;

 error:
  fprintf(stderr, "error while fetching object state");
  return -1;
}
</pre>

<p>GCC accepts this code, but it produces code that will usually crash
when <code>result</code> goes out of scope if the jump is taken.  (It's
possible for this bug to go undetected because it often won't crash if
the stack is fresh, i.e. still zeroed.)  Therefore, Clang rejects this
code with a hard error:</p>

<pre>
<b>t.c:3:5: <span class="error">error:</span> goto into protected scope</b>
    goto error;
<span class="caret">    ^</span>
<b>t.c:5:15: <span class="note">note:</note></b> jump bypasses setup of __block variable
  __block int result;
<span class="caret">              ^</span>
</pre>

<p>The fix is to rewrite the code to not require jumping into a
<tt>__block</tt> variable's scope, e.g. by limiting that scope:</p>

<pre>
  {
    __block int result;
    run_specially_somehow(^{ result = c->state; });
    return result;
  }
</pre>

<!-- ======================================================================= -->
<h3 id="block-variable-initialization">Non-initialization of <tt>__block</tt>
variables</h3>
<!-- ======================================================================= -->

<p>In the following example code, the <tt>x</tt> variable is used before it is
defined:</p>
<pre>
int f0() {
  __block int x;
  return ^(){ return x; }();
}
</pre>

<p>By an accident of implementation, GCC and llvm-gcc unintentionally always
zero initialized <tt>__block</tt> variables. However, any program which depends
on this behavior is relying on unspecified compiler behavior. Programs must
explicitly initialize all local block variables before they are used, as with
other local variables.</p>

<p>Clang does not zero initialize local block variables, and programs which rely
on such behavior will most likely break when built with Clang.</p>


<!-- ======================================================================= -->
<h3 id="inline-asm">Inline assembly</h3>
<!-- ======================================================================= -->

<p>In general, Clang is highly compatible with the GCC inline assembly
extensions, allowing the same set of constraints, modifiers and operands as GCC
inline assembly.</p>

<p>On targets that use the integrated assembler (such as most X86 targets),
inline assembly is run through the integrated assembler instead of your system
assembler (which is most commonly "gas", the GNU assembler).  The LLVM
integrated assembler is extremely compatible with GAS, but there are a couple of
minor places where it is more picky, particularly due to outright GAS bugs.</p>

<p>One specific example is that the assembler rejects ambiguous X86 instructions
that don't have suffixes.  For example:</p>

<pre>
  asm("add %al, (%rax)");
  asm("addw $4, (%rax)");
  asm("add $4, (%rax)");
</pre>

<p>Both clang and GAS accept the first instruction: because the first
instruction uses the 8-bit <tt>%al</tt> register as an operand, it is clear that
it is an 8-bit add.  The second instruction is accepted by both because the "w"
suffix indicates that it is a 16-bit add.  The last instruction is accepted by
GAS even though there is nothing that specifies the size of the instruction (and
the assembler randomly picks a 32-bit add).  Because it is ambiguous, Clang
rejects the instruction with this error message:
</p>

<pre>
<b>&lt;inline asm&gt;:3:1: <span class="error">error:</span> ambiguous instructions require an explicit suffix (could be 'addb', 'addw', 'addl', or 'addq')</b>
add $4, (%rax)
<span class="caret">^</span>
</pre>

<p>To fix this compatibility issue, add an explicit suffix to the instruction:
this makes your code more clear and is compatible with both GCC and Clang.</p>

<!-- ======================================================================= -->
<h2 id="objective-c">Objective-C compatibility</h2>
<!-- ======================================================================= -->

<!-- ======================================================================= -->
<h3 id="super-cast">Cast of super</h3>
<!-- ======================================================================= -->

<p>GCC treats the <code>super</code> identifier as an expression that
can, among other things, be cast to a different type. Clang treats
<code>super</code> as a context-sensitive keyword, and will reject a
type-cast of <code>super</code>:</p>

<pre>
<b>super.m:11:12: <span class="error">error:</span> cannot cast 'super' (it isn't an expression)</b>
  [(Super*)super add:4];
<span class="caret">   ~~~~~~~~^</span>
</pre>

<p>To fix this problem, remove the type cast, e.g.</p>
<pre>
  [super add:4];
</pre>

<!-- ======================================================================= -->
<h3 id="sizeof-interface">Size of interfaces</h3>
<!-- ======================================================================= -->

<p>When using the "non-fragile" Objective-C ABI in use, the size of an
Objective-C class may change over time as instance variables are added
(or removed). For this reason, Clang rejects the application of the
<code>sizeof</code> operator to an Objective-C class when using this
ABI:</p>

<pre>
<b>sizeof.m:4:14: <span class="error">error:</span> invalid application of 'sizeof' to interface 'NSArray' in non-fragile ABI</b>
  int size = sizeof(NSArray);
<span class="caret">             ^     ~~~~~~~~~</span>
</pre>

<p>Code that relies on the size of an Objective-C class is likely to
be broken anyway, since that size is not actually constant. To address
this problem, use the Objective-C runtime API function
<code>class_getInstanceSize()</code>:</p>

<pre>
  class_getInstanceSize([NSArray class])
</pre>

<!-- ======================================================================= -->
<h3 id="objc_objs-cast">Internal Objective-C types</h3>
<!-- ======================================================================= -->

<p>GCC allows using pointers to internal Objective-C objects, <tt>struct objc_object*</tt>,
<tt>struct objc_selector*</tt>, and <tt>struct objc_class*</tt> in place of the types
<tt>id</tt>, <tt>SEL</tt>, and <tt>Class</tt> respectively. Clang treats the
internal Objective-C structures as implementation detail and won't do implicit conversions:

<pre>
<b>t.mm:11:2: <span class="error">error:</span> no matching function for call to 'f'</b>
        f((struct objc_object *)p);
<span class="caret">        ^</span>
<b>t.mm:5:6: <span class="note">note:</note></b> candidate function not viable: no known conversion from 'struct objc_object *' to 'id' for 1st argument
void f(id x);
<span class="caret">     ^</span>
</pre>

<p>Code should use types <tt>id</tt>, <tt>SEL</tt>, and <tt>Class</tt>
instead of the internal types.</p>

<!-- ======================================================================= -->
<h3 id="c_variables-class">C variables in @interface or @protocol</h3>
<!-- ======================================================================= -->

<p>GCC allows the declaration of C variables in
an <code>@interface</code> or <code>@protocol</code>
declaration. Clang does not allow variable declarations to appear
within these declarations unless they are marked <code>extern</code>.</p>

<p>Variables may still be declared in an @implementation.</p>

<pre>
@interface XX
int a;         // not allowed in clang
int b = 1;     // not allowed in clang
extern int c;  // allowed 
@end

</pre>

<!-- ======================================================================= -->
<h2 id="cxx">C++ compatibility</h2>
<!-- ======================================================================= -->

<!-- ======================================================================= -->
<h3 id="vla">Variable-length arrays</h3>
<!-- ======================================================================= -->

<p>GCC and C99 allow an array's size to be determined at run
time. This extension is not permitted in standard C++. However, Clang
supports such variable length arrays in very limited circumstances for
compatibility with GNU C and C99 programs:</p>

<ul>  
  <li>The element type of a variable length array must be a POD
  ("plain old data") type, which means that it cannot have any
  user-declared constructors or destructors, any base classes, or any
  members of non-POD type. All C types are POD types.</li>

  <li>Variable length arrays cannot be used as the type of a non-type
template parameter.</li> </ul>

<p>If your code uses variable length arrays in a manner that Clang doesn't support, there are several ways to fix your code:

<ol>
<li>replace the variable length array with a fixed-size array if you can
    determine a reasonable upper bound at compile time; sometimes this is as
    simple as changing <tt>int size = ...;</tt> to <tt>const int size
    = ...;</tt> (if the initializer is a compile-time constant);</li>
<li>use <tt>std::vector</tt> or some other suitable container type;
    or</li>
<li>allocate the array on the heap instead using <tt>new Type[]</tt> -
    just remember to <tt>delete[]</tt> it.</li>
</ol>

<!-- ======================================================================= -->
<h3 id="dep_lookup">Unqualified lookup in templates</h3>
<!-- ======================================================================= -->

<p>Some versions of GCC accept the following invalid code:

<pre>
template &lt;typename T&gt; T Squared(T x) {
  return Multiply(x, x);
}

int Multiply(int x, int y) {
  return x * y;
}

int main() {
  Squared(5);
}
</pre>

<p>Clang complains:

<pre>
<b>my_file.cpp:2:10: <span class="error">error:</span> call to function 'Multiply' that is neither visible in the template definition nor found by argument-dependent lookup</b>
  return Multiply(x, x);
<span class="caret">         ^</span>
<b>my_file.cpp:10:3: <span class="note">note:</span></b> in instantiation of function template specialization 'Squared&lt;int&gt;' requested here
  Squared(5);
<span class="caret">  ^</span>
<b>my_file.cpp:5:5: <span class="note">note:</span></b> 'Multiply' should be declared prior to the call site
int Multiply(int x, int y) {
<span class="caret">    ^</span>
</pre>

<p>The C++ standard says that unqualified names like <q>Multiply</q>
are looked up in two ways.

<p>First, the compiler does <i>unqualified lookup</i> in the scope
where the name was written.  For a template, this means the lookup is
done at the point where the template is defined, not where it's
instantiated.  Since <tt>Multiply</tt> hasn't been declared yet at
this point, unqualified lookup won't find it.

<p>Second, if the name is called like a function, then the compiler
also does <i>argument-dependent lookup</i> (ADL).  (Sometimes
unqualified lookup can suppress ADL; see [basic.lookup.argdep]p3 for
more information.)  In ADL, the compiler looks at the types of all the
arguments to the call.  When it finds a class type, it looks up the
name in that class's namespace; the result is all the declarations it
finds in those namespaces, plus the declarations from unqualified
lookup.  However, the compiler doesn't do ADL until it knows all the
argument types.

<p>In our example, <tt>Multiply</tt> is called with dependent
arguments, so ADL isn't done until the template is instantiated.  At
that point, the arguments both have type <tt>int</tt>, which doesn't
contain any class types, and so ADL doesn't look in any namespaces.
Since neither form of lookup found the declaration
of <tt>Multiply</tt>, the code doesn't compile.

<p>Here's another example, this time using overloaded operators,
which obey very similar rules.

<pre>#include &lt;iostream&gt;

template&lt;typename T&gt;
void Dump(const T&amp; value) {
  std::cout &lt;&lt; value &lt;&lt; "\n";
}

namespace ns {
  struct Data {};
}

std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, ns::Data data) {
  return out &lt;&lt; "Some data";
}

void Use() {
  Dump(ns::Data());
}</pre>

<p>Again, Clang complains:</p>

<pre>
<b>my_file2.cpp:5:13: <span class="error">error:</span> call to function 'operator&lt;&lt;' that is neither visible in the template definition nor found by argument-dependent lookup</b>
  std::cout &lt;&lt; value &lt;&lt; "\n";
<span class="caret">            ^</span>
<b>my_file2.cpp:17:3: <span class="note">note:</span></b> in instantiation of function template specialization 'Dump&lt;ns::Data&gt;' requested here
  Dump(ns::Data());
<span class="caret">  ^</span>
<b>my_file2.cpp:12:15: <span class="note">note:</span></b> 'operator&lt;&lt;' should be declared prior to the call site or in namespace 'ns'
std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, ns::Data data) {
<span class="caret">              ^</span>
</pre>

<p>Just like before, unqualified lookup didn't find any declarations
with the name <tt>operator&lt;&lt;</tt>.  Unlike before, the argument
types both contain class types: one of them is an instance of the
class template type <tt>std::basic_ostream</tt>, and the other is the
type <tt>ns::Data</tt> that we declared above.  Therefore, ADL will
look in the namespaces <tt>std</tt> and <tt>ns</tt> for
an <tt>operator&lt;&lt;</tt>.  Since one of the argument types was
still dependent during the template definition, ADL isn't done until
the template is instantiated during <tt>Use</tt>, which means that
the <tt>operator&lt;&lt;</tt> we want it to find has already been
declared.  Unfortunately, it was declared in the global namespace, not
in either of the namespaces that ADL will look in!

<p>There are two ways to fix this problem:</p>
<ol><li>Make sure the function you want to call is declared before the
template that might call it.  This is the only option if none of its
argument types contain classes.  You can do this either by moving the
template definition, or by moving the function definition, or by
adding a forward declaration of the function before the template.</li>
<li>Move the function into the same namespace as one of its arguments
so that ADL applies.</li></ol>

<p>For more information about argument-dependent lookup, see
[basic.lookup.argdep].  For more information about the ordering of
lookup in templates, see [temp.dep.candidate].

<!-- ======================================================================= -->
<h3 id="dep_lookup_bases">Unqualified lookup into dependent bases of class templates</h3>
<!-- ======================================================================= -->

Some versions of GCC accept the following invalid code:

<pre>
template &lt;typename T&gt; struct Base {
  void DoThis(T x) {}
  static void DoThat(T x) {}
};

template &lt;typename T&gt; struct Derived : public Base&lt;T&gt; {
  void Work(T x) {
    DoThis(x);  // Invalid!
    DoThat(x);  // Invalid!
  }
};
</pre>

Clang correctly rejects it with the following errors
(when <tt>Derived</tt> is eventually instantiated):

<pre>
<b>my_file.cpp:8:5: <span class="error">error:</span> use of undeclared identifier 'DoThis'</b>
    DoThis(x);
<span class="caret">    ^</span>
    this-&gt;
<b>my_file.cpp:2:8: <span class="note">note:</note></b> must qualify identifier to find this declaration in dependent base class
  void DoThis(T x) {}
<span class="caret">       ^</span>
<b>my_file.cpp:9:5: <span class="error">error:</span> use of undeclared identifier 'DoThat'</b>
    DoThat(x);
<span class="caret">    ^</span>
    this-&gt;
<b>my_file.cpp:3:15: <span class="note">note:</note></b> must qualify identifier to find this declaration in dependent base class
  static void DoThat(T x) {}
</pre>

Like we said <a href="#dep_lookup">above</a>, unqualified names like
<tt>DoThis</tt> and <tt>DoThat</tt> are looked up when the template
<tt>Derived</tt> is defined, not when it's instantiated.  When we look
up a name used in a class, we usually look into the base classes.
However, we can't look into the base class <tt>Base&lt;T&gt;</tt>
because its type depends on the template argument <tt>T</tt>, so the
standard says we should just ignore it.  See [temp.dep]p3 for details.

<p>The fix, as Clang tells you, is to tell the compiler that we want a
class member by prefixing the calls with <tt>this-&gt;</tt>:

<pre>
  void Work(T x) {
    <b>this-&gt;</b>DoThis(x);
    <b>this-&gt;</b>DoThat(x);
  }
</pre>

Alternatively, you can tell the compiler exactly where to look:

<pre>
  void Work(T x) {
    <b>Base&lt;T&gt;</b>::DoThis(x);
    <b>Base&lt;T&gt;</b>::DoThat(x);
  }
</pre>

This works whether the methods are static or not, but be careful:
if <tt>DoThis</tt> is virtual, calling it this way will bypass virtual
dispatch!

<!-- ======================================================================= -->
<h3 id="undep_incomplete">Incomplete types in templates</h3>
<!-- ======================================================================= -->

The following code is invalid, but compilers are allowed to accept it:

<pre>
  class IOOptions;
  template &lt;class T&gt; bool read(T &amp;value) {
    IOOptions opts;
    return read(opts, value);
  }

  class IOOptions { bool ForceReads; };
  bool read(const IOOptions &amp;opts, int &amp;x);
  template bool read&lt;&gt;(int &amp;);
</pre>

The standard says that types which don't depend on template parameters
must be complete when a template is defined if they affect the
program's behavior.  However, the standard also says that compilers
are free to not enforce this rule.  Most compilers enforce it to some
extent; for example, it would be an error in GCC to
write <tt>opts.ForceReads</tt> in the code above.  In Clang, we feel
that enforcing the rule consistently lets us provide a better
experience, but unfortunately it also means we reject some code that
other compilers accept.

<p>We've explained the rule here in very imprecise terms; see
[temp.res]p8 for details.

<!-- ======================================================================= -->
<h3 id="bad_templates">Templates with no valid instantiations</h3>
<!-- ======================================================================= -->

The following code contains a typo: the programmer
meant <tt>init()</tt> but wrote <tt>innit()</tt> instead.

<pre>
  template &lt;class T&gt; class Processor {
    ...
    void init();
    ...
  };
  ...
  template &lt;class T&gt; void process() {
    Processor&lt;T&gt; processor;
    processor.innit();       // <-- should be 'init()'
    ...
  }
</pre>

Unfortunately, we can't flag this mistake as soon as we see it: inside
a template, we're not allowed to make assumptions about "dependent
types" like <tt>Processor&lt;T&gt;</tt>.  Suppose that later on in
this file the programmer adds an explicit specialization
of <tt>Processor</tt>, like so:

<pre>
  template &lt;&gt; class Processor&lt;char*&gt; {
    void innit();
  };
</pre>

Now the program will work &mdash; as long as the programmer only ever
instantiates <tt>process()</tt> with <tt>T = char*</tt>!  This is why
it's hard, and sometimes impossible, to diagnose mistakes in a
template definition before it's instantiated.

<p>The standard says that a template with no valid instantiations is
ill-formed.  Clang tries to do as much checking as possible at
definition-time instead of instantiation-time: not only does this
produce clearer diagnostics, but it also substantially improves
compile times when using pre-compiled headers.  The downside to this
philosophy is that Clang sometimes fails to process files because they
contain broken templates that are no longer used.  The solution is
simple: since the code is unused, just remove it.

<!-- ======================================================================= -->
<h3 id="default_init_const">Default initialization of const variable of a class type requires user-defined default constructor</h3>
<!-- ======================================================================= -->

If a <tt>class</tt> or <tt>struct</tt> has no user-defined default
constructor, C++ doesn't allow you to default construct a <tt>const</tt>
instance of it like this ([dcl.init], p9):

<pre>
class Foo {
 public:
  // The compiler-supplied default constructor works fine, so we
  // don't bother with defining one.
  ...
};

void Bar() {
  const Foo foo;  // Error!
  ...
}
</pre>

To fix this, you can define a default constructor for the class:

<pre>
class Foo {
 public:
  Foo() {}
  ...
};

void Bar() {
  const Foo foo;  // Now the compiler is happy.
  ...
}
</pre>

<!-- ======================================================================= -->
<h3 id="param_name_lookup">Parameter name lookup</h3>
<!-- ======================================================================= -->

<p>Due to a bug in its implementation, GCC allows the redeclaration of function parameter names within a function prototype in C++ code, e.g.</p>
<blockquote>
<pre>
void f(int a, int a);
</pre>
</blockquote>
<p>Clang diagnoses this error (where the parameter name has been redeclared). To fix this problem, rename one of the parameters.</p>

<!-- ======================================================================= -->
<h2 id="cxx11">C++11 compatibility</h2>
<!-- ======================================================================= -->

<!-- ======================================================================= -->
<h3 id="deleted-special-func">Deleted special member functions</h3>
<!-- ======================================================================= -->

<p>In C++11, the explicit declaration of a move constructor or a move
assignment operator within a class deletes the implicit declaration
of the copy constructor and copy assignment operator. This change came
fairly late in the C++11 standardization process, so early
implementations of C++11 (including Clang before 3.0, GCC before 4.7,
and Visual Studio 2010) do not implement this rule, leading them to
accept this ill-formed code:</p>

<pre>
struct X {
  X(X&amp;&amp;); <i>// deletes implicit copy constructor:</i>
  <i>// X(const X&amp;) = delete;</i>
};

void f(X x);
void g(X x) {
  f(x); <i>// error: X has a deleted copy constructor</i>
}
</pre>

<p>This affects some early C++11 code, including Boost's popular <a
href="http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm"><tt>shared_ptr</tt></a>
up to version 1.47.0. The fix for Boost's <tt>shared_ptr</tt> is
<a href="https://svn.boost.org/trac/boost/changeset/73202">available here</a>.</p>

<!-- ======================================================================= -->
<h2 id="objective-cxx">Objective-C++ compatibility</h2>
<!-- ======================================================================= -->

<!-- ======================================================================= -->
<h3 id="implicit-downcasts">Implicit downcasts</h3>
<!-- ======================================================================= -->

<p>Due to a bug in its implementation, GCC allows implicit downcasts
of Objective-C pointers (from a base class to a derived class) when
calling functions. Such code is inherently unsafe, since the object
might not actually be an instance of the derived class, and is
rejected by Clang. For example, given this code:</p>

<pre>
@interface Base @end
@interface Derived : Base @end

void f(Derived *p);
void g(Base *p) {
  f(p);
}
</pre>

<p>Clang produces the following error:</p>

<pre>
<b>downcast.mm:6:3: <span class="error">error:</span> no matching function for call to 'f'</b>
  f(p);
<span class="caret">  ^</span>
<b>downcast.mm:4:6: <span class="note">note:</note></b> candidate function not viable: cannot convert from
      superclass 'Base *' to subclass 'Derived *' for 1st argument
void f(Derived *p);
<span class="caret">     ^</span>
</pre>

<p>If the downcast is actually correct (e.g., because the code has
already checked that the object has the appropriate type), add an
explicit cast:</p>

<pre>
  f((Derived *)base);
</pre>

<!-- ======================================================================= -->
<h3 id="class-as-property-name">Using <code>class</code> as a property name</h3>
<!-- ======================================================================= -->

<p>In C and Objective-C, <code>class</code> is a normal identifier and
can be used to name fields, ivars, methods, and so on.  In
C++, <code>class</code> is a keyword.  For compatibility with existing
code, Clang permits <code>class</code> to be used as part of a method
selector in Objective-C++, but this does not extend to any other part
of the language.  In particular, it is impossible to use property dot
syntax in Objective-C++ with the property name <code>class</code>, so
the following code will fail to parse:</p>

<pre>
@interface I {
int cls;
}
+ (int)class;
@end

@implementation  I
- (int) Meth { return I.class; }
@end
</pre>

<p>Use explicit message-send syntax instead, i.e. <code>[I class]</code>.</p>

</div>
</body>
</html>
