Home | History | Annotate | Download | only in www
      1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
      2           "http://www.w3.org/TR/html4/strict.dtd">
      3 <html>
      4 <head>
      5   <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
      6   <title>Language Compatibility</title>
      7   <link type="text/css" rel="stylesheet" href="menu.css" />
      8   <link type="text/css" rel="stylesheet" href="content.css" />
      9   <style type="text/css">
     10 </style>
     11 </head>
     12 <body>
     13 
     14 <!--#include virtual="menu.html.incl"-->
     15 
     16 <div id="content">
     17 
     18 <!-- ======================================================================= -->
     19 <h1>Language Compatibility</h1>
     20 <!-- ======================================================================= -->
     21 
     22 <p>Clang strives to both conform to current language standards (C99,
     23   C++98) and also to implement many widely-used extensions available
     24   in other compilers, so that most correct code will "just work" when
     25   compiler with Clang. However, Clang is more strict than other
     26   popular compilers, and may reject incorrect code that other
     27   compilers allow. This page documents common compatibility and
     28   portability issues with Clang to help you understand and fix the
     29   problem in your code when Clang emits an error message.</p>
     30   
     31 <ul>
     32   <li><a href="#c">C compatibility</a>
     33     <ul>
     34       <li><a href="#inline">C99 inline functions</a></li>
     35       <li><a href="#vector_builtins">"missing" vector __builtin functions</a></li>
     36       <li><a href="#lvalue-cast">Lvalue casts</a></li>
     37       <li><a href="#blocks-in-protected-scope">Jumps to within <tt>__block</tt> variable scope</a></li>
     38       <li><a href="#block-variable-initialization">Non-initialization of <tt>__block</tt> variables</a></li>
     39       <li><a href="#inline-asm">Inline assembly</a></li>
     40     </ul>
     41   </li>
     42   <li><a href="#objective-c">Objective-C compatibility</a>
     43     <ul>
     44       <li><a href="#super-cast">Cast of super</a></li>
     45       <li><a href="#sizeof-interface">Size of interfaces</a></li>
     46       <li><a href="#objc_objs-cast">Internal Objective-C types</a></li>
     47       <li><a href="#c_variables-class">C variables in @class or @protocol</a></li>
     48     </ul>
     49   </li>
     50   <li><a href="#c++">C++ compatibility</a>
     51     <ul>
     52       <li><a href="#vla">Variable-length arrays</a></li>
     53       <li><a href="#dep_lookup">Unqualified lookup in templates</a></li>
     54       <li><a href="#dep_lookup_bases">Unqualified lookup into dependent bases of class templates</a></li>
     55       <li><a href="#undep_incomplete">Incomplete types in templates</a></li>
     56       <li><a href="#bad_templates">Templates with no valid instantiations</a></li>
     57       <li><a href="#default_init_const">Default initialization of const
     58       variable of a class type requires user-defined default
     59       constructor</a></li>
     60       <li><a href="#param_name_lookup">Parameter name lookup</a></li>
     61     </ul>
     62   </li>
     63   <li><a href="#objective-c++">Objective-C++ compatibility</a>
     64     <ul>
     65       <li><a href="#implicit-downcasts">Implicit downcasts</a></li>
     66     </ul>
     67     <ul>
     68       <li><a href="#class-as-property-name">Using <code>class</code> as a property name</a></li>
     69     </ul>
     70   </li>
     71 </ul>
     72 
     73 <!-- ======================================================================= -->
     74 <h2 id="c">C compatibility</h3>
     75 <!-- ======================================================================= -->
     76 
     77 <!-- ======================================================================= -->
     78 <h3 id="inline">C99 inline functions</h3>
     79 <!-- ======================================================================= -->
     80 <p>By default, Clang builds C code according to the C99 standard,
     81 which provides different semantics for the <code>inline</code> keyword
     82 than GCC's default behavior. For example, consider the following
     83 code:</p>
     84 <pre>
     85 inline int add(int i, int j) { return i + j; }
     86 
     87 int main() {
     88   int i = add(4, 5);
     89   return i;
     90 }
     91 </pre>
     92 
     93 <p>In C99, <code>inline</code> means that a function's definition is
     94 provided only for inlining, and that there is another definition
     95 (without <code>inline</code>) somewhere else in the program.  That
     96 means that this program is incomplete, because if <code>add</code>
     97 isn't inlined (for example, when compiling without optimization), then
     98 <code>main</code> will have an unresolved reference to that other
     99 definition.  Therefore we'll get a (correct) link-time error like this:</p>
    100 
    101 <pre>
    102 Undefined symbols:
    103   "_add", referenced from:
    104       _main in cc-y1jXIr.o
    105 </pre>
    106 
    107 <p>By contrast, GCC's default behavior follows the GNU89 dialect,
    108 which is the C89 standard plus a lot of extensions.  C89 doesn't have
    109 an <code>inline</code> keyword, but GCC recognizes it as an extension
    110 and just treats it as a hint to the optimizer.</p>
    111 
    112 <p>There are several ways to fix this problem:</p>
    113 
    114 <ul>
    115   <li>Change <code>add</code> to a <code>static inline</code>
    116   function.  This is usually the right solution if only one
    117   translation unit needs to use the function.  <code>static
    118   inline</code> functions are always resolved within the translation
    119   unit, so you won't have to add a non-<code>inline</code> definition
    120   of the function elsewhere in your program.</li>
    121 
    122   <li>Remove the <code>inline</code> keyword from this definition of
    123   <code>add</code>.  The <code>inline</code> keyword is not required
    124   for a function to be inlined, nor does it guarantee that it will be.
    125   Some compilers ignore it completely.  Clang treats it as a mild
    126   suggestion from the programmer.</li>
    127      
    128   <li>Provide an external (non-<code>inline</code>) definition
    129   of <code>add</code> somewhere else in your program.  The two
    130   definitions must be equivalent!</li>
    131 
    132   <li>Compile with the GNU89 dialect by adding
    133   <code>-std=gnu89</code> to the set of Clang options. This option is
    134   only recommended if the program source cannot be changed or if the
    135   program also relies on additional C89-specific behavior that cannot
    136   be changed.</li>
    137 </ul>
    138 
    139 <p>All of this only applies to C code; the meaning of <code>inline</code>
    140 in C++ is very different from its meaning in either GNU89 or C99.</p>
    141 
    142 <!-- ======================================================================= -->
    143 <h3 id="vector_builtins">"missing" vector __builtin functions</h3>
    144 <!-- ======================================================================= -->
    145 
    146 <p>The Intel and AMD manuals document a number "<tt>&lt;*mmintrin.h&gt;</tt>"
    147 header files, which define a standardized API for accessing vector operations
    148 on X86 CPUs.  These functions have names like <tt>_mm_xor_ps</tt> and
    149 <tt>_mm256_addsub_pd</tt>.  Compilers have leeway to implement these functions
    150 however they want.  Since Clang supports an excellent set of <a 
    151 href="../docs/LanguageExtensions.html#vectors">native vector operations</a>,
    152 the Clang headers implement these interfaces in terms of the native vector 
    153 operations.
    154 </p>
    155 
    156 <p>In contrast, GCC implements these functions mostly as a 1-to-1 mapping to
    157 builtin function calls, like <tt>__builtin_ia32_paddw128</tt>.  These builtin
    158 functions are an internal implementation detail of GCC, and are not portable to
    159 the Intel compiler, the Microsoft compiler, or Clang.  If you get build errors
    160 mentioning these, the fix is simple: switch to the *mmintrin.h functions.</p>
    161 
    162 <p>The same issue occurs for NEON and Altivec for the ARM and PowerPC
    163 architectures respectively.  For these, make sure to use the &lt;arm_neon.h&gt;
    164 and &lt;altivec.h&gt; headers.</p>
    165 
    166 <p>For x86 architectures this <a href="builtins.py">script</a> should help with
    167 the manual migration process.  It will rewrite your source files in place to
    168 use the APIs instead of builtin function calls. Just call it like this:</p>
    169 
    170 <pre>
    171   builtins.py *.c *.h
    172 </pre>
    173 
    174 <p>and it will rewrite all of the .c and .h files in the current directory to
    175 use the API calls instead of calls like <tt>__builtin_ia32_paddw128</tt>.</p>
    176 
    177 <!-- ======================================================================= -->
    178 <h3 id="lvalue-cast">Lvalue casts</h3>
    179 <!-- ======================================================================= -->
    180 
    181 <p>Old versions of GCC permit casting the left-hand side of an assignment to a
    182 different type. Clang produces an error on similar code, e.g.,</p>
    183 
    184 <pre>
    185 lvalue.c:2:3: error: assignment to cast is illegal, lvalue casts are not
    186       supported
    187   (int*)addr = val;
    188   ^~~~~~~~~~ ~
    189 </pre>
    190 
    191 <p>To fix this problem, move the cast to the right-hand side. In this
    192 example, one could use:</p>
    193 
    194 <pre>
    195   addr = (float *)val;
    196 </pre>
    197 
    198 <!-- ======================================================================= -->
    199 <h3 id="blocks-in-protected-scope">Jumps to within <tt>__block</tt> variable scope</h3>
    200 <!-- ======================================================================= -->
    201 
    202 <p>Clang disallows jumps into the scope of a <tt>__block</tt>
    203 variable.  Variables marked with <tt>__block</tt> require special
    204 runtime initialization. A jump into the scope of a <tt>__block</tt>
    205 variable bypasses this initialization, leaving the variable's metadata
    206 in an invalid state.  Consider the following code fragment:</p>
    207 
    208 <pre>
    209 int fetch_object_state(struct MyObject *c) {
    210   if (!c->active) goto error;
    211 
    212   __block int result;
    213   run_specially_somehow(^{ result = c->state; });
    214   return result;
    215 
    216  error:
    217   fprintf(stderr, "error while fetching object state");
    218   return -1;
    219 }
    220 </pre>
    221 
    222 <p>GCC accepts this code, but it produces code that will usually crash
    223 when <code>result</code> goes out of scope if the jump is taken.  (It's
    224 possible for this bug to go undetected because it often won't crash if
    225 the stack is fresh, i.e. still zeroed.)  Therefore, Clang rejects this
    226 code with a hard error:</p>
    227 
    228 <pre>
    229 t.c:3:5: error: goto into protected scope
    230     goto error;
    231     ^
    232 t.c:5:15: note: jump bypasses setup of __block variable
    233   __block int result;
    234               ^
    235 </pre>
    236 
    237 <p>The fix is to rewrite the code to not require jumping into a
    238 <tt>__block</tt> variable's scope, e.g. by limiting that scope:</p>
    239 
    240 <pre>
    241   {
    242     __block int result;
    243     run_specially_somehow(^{ result = c->state; });
    244     return result;
    245   }
    246 </pre>
    247 
    248 <!-- ======================================================================= -->
    249 <h3 id="block-variable-initialization">Non-initialization of <tt>__block</tt>
    250 variables</h3>
    251 <!-- ======================================================================= -->
    252 
    253 <p>In the following example code, the <tt>x</tt> variable is used before it is
    254 defined:</p>
    255 <pre>
    256 int f0() {
    257   __block int x;
    258   return ^(){ return x; }();
    259 }
    260 </pre>
    261 
    262 <p>By an accident of implementation, GCC and llvm-gcc unintentionally always
    263 zero initialized <tt>__block</tt> variables. However, any program which depends
    264 on this behavior is relying on unspecified compiler behavior. Programs must
    265 explicitly initialize all local block variables before they are used, as with
    266 other local variables.</p>
    267 
    268 <p>Clang does not zero initialize local block variables, and programs which rely
    269 on such behavior will most likely break when built with Clang.</p>
    270 
    271 
    272 <!-- ======================================================================= -->
    273 <h3 id="inline-asm">Inline assembly</h3>
    274 <!-- ======================================================================= -->
    275 
    276 <p>In general, Clang is highly compatible with the GCC inline assembly
    277 extensions, allowing the same set of constraints, modifiers and operands as GCC
    278 inline assembly.</p>
    279 
    280 <p>On targets that use the integrated assembler (such as most X86 targets),
    281 inline assembly is run through the integrated assembler instead of your system
    282 assembler (which is most commonly "gas", the GNU assembler).  The LLVM
    283 integrated assembler is extremely compatible with GAS, but there are a couple of
    284 minor places where it is more picky, particularly due to outright GAS bugs.</p>
    285 
    286 <p>One specific example is that the assembler rejects ambiguous X86 instructions
    287 that don't have suffixes.  For example:</p>
    288 
    289 <pre>
    290   asm("add %al, (%rax)");
    291   asm("addw $4, (%rax)");
    292   asm("add $4, (%rax)");
    293 </pre>
    294 
    295 <p>Both clang and GAS accept the first instruction: because the first
    296 instruction uses the 8-bit <tt>%al</tt> register as an operand, it is clear that
    297 it is an 8-bit add.  The second instruction is accepted by both because the "w"
    298 suffix indicates that it is a 16-bit add.  The last instruction is accepted by
    299 GAS even though there is nothing that specifies the size of the instruction (and
    300 the assembler randomly picks a 32-bit add).  Because it is ambiguous, Clang
    301 rejects the instruction with this error message:
    302 </p>
    303 
    304 <pre>
    305 &lt;inline asm&gt;:3:1: error: ambiguous instructions require an explicit suffix (could be 'addb', 'addw', 'addl', or 'addq')
    306 add $4, (%rax)
    307 ^
    308 1 error generated.
    309 </pre>
    310 
    311 <p>To fix this compatibility issue, add an explicit suffix to the instruction:
    312 this makes your code more clear and is compatible with both GCC and Clang.</p>
    313 
    314 <!-- ======================================================================= -->
    315 <h2 id="objective-c">Objective-C compatibility</h3>
    316 <!-- ======================================================================= -->
    317 
    318 <!-- ======================================================================= -->
    319 <h3 id="super-cast">Cast of super</h3>
    320 <!-- ======================================================================= -->
    321 
    322 <p>GCC treats the <code>super</code> identifier as an expression that
    323 can, among other things, be cast to a different type. Clang treats
    324 <code>super</code> as a context-sensitive keyword, and will reject a
    325 type-cast of <code>super</code>:</p>
    326 
    327 <pre>
    328 super.m:11:12: error: cannot cast 'super' (it isn't an expression)
    329   [(Super*)super add:4];
    330    ~~~~~~~~^
    331 </pre>
    332 
    333 <p>To fix this problem, remove the type cast, e.g.</p>
    334 <pre>
    335   [super add:4];
    336 </pre>
    337 
    338 <!-- ======================================================================= -->
    339 <h3 id="sizeof-interface">Size of interfaces</h3>
    340 <!-- ======================================================================= -->
    341 
    342 <p>When using the "non-fragile" Objective-C ABI in use, the size of an
    343 Objective-C class may change over time as instance variables are added
    344 (or removed). For this reason, Clang rejects the application of the
    345 <code>sizeof</code> operator to an Objective-C class when using this
    346 ABI:</p>
    347 
    348 <pre>
    349 sizeof.m:4:14: error: invalid application of 'sizeof' to interface 'NSArray' in
    350       non-fragile ABI
    351   int size = sizeof(NSArray);
    352              ^     ~~~~~~~~~
    353 </pre>
    354 
    355 <p>Code that relies on the size of an Objective-C class is likely to
    356 be broken anyway, since that size is not actually constant. To address
    357 this problem, use the Objective-C runtime API function
    358 <code>class_getInstanceSize()</code>:</p>
    359 
    360 <pre>
    361   class_getInstanceSize([NSArray class])
    362 </pre>
    363 
    364 <!-- ======================================================================= -->
    365 <h3 id="objc_objs-cast">Internal Objective-C types</h3>
    366 <!-- ======================================================================= -->
    367 
    368 <p>GCC allows using pointers to internal Objective-C objects, <tt>struct objc_object*</tt>,
    369 <tt>struct objc_selector*</tt>, and <tt>struct objc_class*</tt> in place of the types
    370 <tt>id</tt>, <tt>SEL</tt>, and <tt>Class</tt> respectively. Clang treats the
    371 internal Objective-C structures as implementation detail and won't do implicit conversions:
    372 
    373 <pre>
    374 t.mm:11:2: error: no matching function for call to 'f'
    375         f((struct objc_object *)p);
    376         ^
    377 t.mm:5:6: note: candidate function not viable: no known conversion from 'struct objc_object *' to 'id' for 1st argument
    378 void f(id x);
    379      ^
    380 </pre>
    381 
    382 <p>Code should use types <tt>id</tt>, <tt>SEL</tt>, and <tt>Class</tt>
    383 instead of the internal types.</p>
    384 
    385 <!-- ======================================================================= -->
    386 <h3 id="c_variables-class">C variables in @interface or @protocol</h3>
    387 <!-- ======================================================================= -->
    388 
    389 <p>GCC allows the declaration of C variables in
    390 an <code>@interface</code> or <code>@protocol</code>
    391 declaration. Clang does not allow variable declarations to appear
    392 within these declarations unless they are marked <code>extern</code>.</p>
    393 
    394 <p>Variables may still be declared in an @implementation.</p>
    395 
    396 <pre>
    397 @interface XX
    398 int a;         // not allowed in clang
    399 int b = 1;     // not allowed in clang
    400 extern int c;  // allowed 
    401 @end
    402 
    403 </pre>
    404 
    405 <!-- ======================================================================= -->
    406 <h2 id="c++">C++ compatibility</h3>
    407 <!-- ======================================================================= -->
    408 
    409 <!-- ======================================================================= -->
    410 <h3 id="vla">Variable-length arrays</h3>
    411 <!-- ======================================================================= -->
    412 
    413 <p>GCC and C99 allow an array's size to be determined at run
    414 time. This extension is not permitted in standard C++. However, Clang
    415 supports such variable length arrays in very limited circumstances for
    416 compatibility with GNU C and C99 programs:</p>
    417 
    418 <ul>  
    419   <li>The element type of a variable length array must be a POD
    420   ("plain old data") type, which means that it cannot have any
    421   user-declared constructors or destructors, any base classes, or any
    422   members of non-POD type. All C types are POD types.</li>
    423 
    424   <li>Variable length arrays cannot be used as the type of a non-type
    425 template parameter.</li> </ul>
    426 
    427 <p>If your code uses variable length arrays in a manner that Clang doesn't support, there are several ways to fix your code:
    428 
    429 <ol>
    430 <li>replace the variable length array with a fixed-size array if you can
    431     determine a reasonable upper bound at compile time; sometimes this is as
    432     simple as changing <tt>int size = ...;</tt> to <tt>const int size
    433     = ...;</tt> (if the initializer is a compile-time constant);</li>
    434 <li>use <tt>std::vector</tt> or some other suitable container type;
    435     or</li>
    436 <li>allocate the array on the heap instead using <tt>new Type[]</tt> -
    437     just remember to <tt>delete[]</tt> it.</li>
    438 </ol>
    439 
    440 <!-- ======================================================================= -->
    441 <h3 id="dep_lookup">Unqualified lookup in templates</h3>
    442 <!-- ======================================================================= -->
    443 
    444 <p>Some versions of GCC accept the following invalid code:
    445 
    446 <pre>
    447 template &lt;typename T&gt; T Squared(T x) {
    448   return Multiply(x, x);
    449 }
    450 
    451 int Multiply(int x, int y) {
    452   return x * y;
    453 }
    454 
    455 int main() {
    456   Squared(5);
    457 }
    458 </pre>
    459 
    460 <p>Clang complains:
    461 
    462 <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>
    463     return Multiply(x, x);
    464   <span class="caret">         ^</span>
    465   <b>my_file.cpp:10:3: <span class="note">note:</span> in instantiation of function template specialization 'Squared&lt;int&gt;' requested here</b>
    466     Squared(5);
    467   <span class="caret">  ^</span>
    468   <b>my_file.cpp:5:5: <span class="note">note:</span> 'Multiply' should be declared prior to the call site</b>
    469   int Multiply(int x, int y) {
    470   <span class="caret">    ^</span>
    471 </pre>
    472 
    473 <p>The C++ standard says that unqualified names like <q>Multiply</q>
    474 are looked up in two ways.
    475 
    476 <p>First, the compiler does <i>unqualified lookup</i> in the scope
    477 where the name was written.  For a template, this means the lookup is
    478 done at the point where the template is defined, not where it's
    479 instantiated.  Since <tt>Multiply</tt> hasn't been declared yet at
    480 this point, unqualified lookup won't find it.
    481 
    482 <p>Second, if the name is called like a function, then the compiler
    483 also does <i>argument-dependent lookup</i> (ADL).  (Sometimes
    484 unqualified lookup can suppress ADL; see [basic.lookup.argdep]p3 for
    485 more information.)  In ADL, the compiler looks at the types of all the
    486 arguments to the call.  When it finds a class type, it looks up the
    487 name in that class's namespace; the result is all the declarations it
    488 finds in those namespaces, plus the declarations from unqualified
    489 lookup.  However, the compiler doesn't do ADL until it knows all the
    490 argument types.
    491 
    492 <p>In our example, <tt>Multiply</tt> is called with dependent
    493 arguments, so ADL isn't done until the template is instantiated.  At
    494 that point, the arguments both have type <tt>int</tt>, which doesn't
    495 contain any class types, and so ADL doesn't look in any namespaces.
    496 Since neither form of lookup found the declaration
    497 of <tt>Multiply</tt>, the code doesn't compile.
    498 
    499 <p>Here's another example, this time using overloaded operators,
    500 which obey very similar rules.
    501 
    502 <pre>#include &lt;iostream&gt;
    503 
    504 template&lt;typename T&gt;
    505 void Dump(const T&amp; value) {
    506   std::cout &lt;&lt; value &lt;&lt; "\n";
    507 }
    508 
    509 namespace ns {
    510   struct Data {};
    511 }
    512 
    513 std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, ns::Data data) {
    514   return out &lt;&lt; "Some data";
    515 }
    516 
    517 void Use() {
    518   Dump(ns::Data());
    519 }</pre>
    520 
    521 <p>Again, Clang complains:</p>
    522 
    523 <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>
    524     std::cout &lt;&lt; value &lt;&lt; "\n";
    525   <span class="caret">            ^</span>
    526   <b>my_file2.cpp:17:3: <span class="error">note:</span> in instantiation of function template specialization 'Dump&lt;ns::Data&gt;' requested here</b>
    527     Dump(ns::Data());
    528   <span class="caret">  ^</span>
    529   <b>my_file2.cpp:12:15: <span class="error">note:</span> 'operator&lt;&lt;' should be declared prior to the call site or in namespace 'ns'</b>
    530   std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, ns::Data data) {
    531   <span class="caret">              ^</span>
    532 </pre>
    533 
    534 <p>Just like before, unqualified lookup didn't find any declarations
    535 with the name <tt>operator&lt;&lt;</tt>.  Unlike before, the argument
    536 types both contain class types: one of them is an instance of the
    537 class template type <tt>std::basic_ostream</tt>, and the other is the
    538 type <tt>ns::Data</tt> that we declared above.  Therefore, ADL will
    539 look in the namespaces <tt>std</tt> and <tt>ns</tt> for
    540 an <tt>operator&lt;&lt;</tt>.  Since one of the argument types was
    541 still dependent during the template definition, ADL isn't done until
    542 the template is instantiated during <tt>Use</tt>, which means that
    543 the <tt>operator&lt;&lt;</tt> we want it to find has already been
    544 declared.  Unfortunately, it was declared in the global namespace, not
    545 in either of the namespaces that ADL will look in!
    546 
    547 <p>There are two ways to fix this problem:</p>
    548 <ol><li>Make sure the function you want to call is declared before the
    549 template that might call it.  This is the only option if none of its
    550 argument types contain classes.  You can do this either by moving the
    551 template definition, or by moving the function definition, or by
    552 adding a forward declaration of the function before the template.</li>
    553 <li>Move the function into the same namespace as one of its arguments
    554 so that ADL applies.</li></ol>
    555 
    556 <p>For more information about argument-dependent lookup, see
    557 [basic.lookup.argdep].  For more information about the ordering of
    558 lookup in templates, see [temp.dep.candidate].
    559 
    560 <!-- ======================================================================= -->
    561 <h3 id="dep_lookup_bases">Unqualified lookup into dependent bases of class templates</h3>
    562 <!-- ======================================================================= -->
    563 
    564 Some versions of GCC accept the following invalid code:
    565 
    566 <pre>
    567 template &lt;typename T&gt; struct Base {
    568   void DoThis(T x) {}
    569   static void DoThat(T x) {}
    570 };
    571 
    572 template &lt;typename T&gt; struct Derived : public Base&lt;T&gt; {
    573   void Work(T x) {
    574     DoThis(x);  // Invalid!
    575     DoThat(x);  // Invalid!
    576   }
    577 };
    578 </pre>
    579 
    580 Clang correctly rejects it with the following errors
    581 (when <tt>Derived</tt> is eventually instantiated):
    582 
    583 <pre>
    584 my_file.cpp:8:5: error: use of undeclared identifier 'DoThis'
    585     DoThis(x);
    586     ^
    587     this-&gt;
    588 my_file.cpp:2:8: note: must qualify identifier to find this declaration in dependent base class
    589   void DoThis(T x) {}
    590        ^
    591 my_file.cpp:9:5: error: use of undeclared identifier 'DoThat'
    592     DoThat(x);
    593     ^
    594     this-&gt;
    595 my_file.cpp:3:15: note: must qualify identifier to find this declaration in dependent base class
    596   static void DoThat(T x) {}
    597 </pre>
    598 
    599 Like we said <a href="#dep_lookup">above</a>, unqualified names like
    600 <tt>DoThis</tt> and <tt>DoThat</tt> are looked up when the template
    601 <tt>Derived</tt> is defined, not when it's instantiated.  When we look
    602 up a name used in a class, we usually look into the base classes.
    603 However, we can't look into the base class <tt>Base&lt;T&gt;</tt>
    604 because its type depends on the template argument <tt>T</tt>, so the
    605 standard says we should just ignore it.  See [temp.dep]p3 for details.
    606 
    607 <p>The fix, as Clang tells you, is to tell the compiler that we want a
    608 class member by prefixing the calls with <tt>this-&gt;</tt>:
    609 
    610 <pre>
    611   void Work(T x) {
    612     <b>this-&gt;</b>DoThis(x);
    613     <b>this-&gt;</b>DoThat(x);
    614   }
    615 </pre>
    616 
    617 Alternatively, you can tell the compiler exactly where to look:
    618 
    619 <pre>
    620   void Work(T x) {
    621     <b>Base&lt;T&gt;</b>::DoThis(x);
    622     <b>Base&lt;T&gt;</b>::DoThat(x);
    623   }
    624 </pre>
    625 
    626 This works whether the methods are static or not, but be careful:
    627 if <tt>DoThis</tt> is virtual, calling it this way will bypass virtual
    628 dispatch!
    629 
    630 <!-- ======================================================================= -->
    631 <h3 id="undep_incomplete">Incomplete types in templates</h3>
    632 <!-- ======================================================================= -->
    633 
    634 The following code is invalid, but compilers are allowed to accept it:
    635 
    636 <pre>
    637   class IOOptions;
    638   template &lt;class T&gt; bool read(T &amp;value) {
    639     IOOptions opts;
    640     return read(opts, value);
    641   }
    642 
    643   class IOOptions { bool ForceReads; };
    644   bool read(const IOOptions &amp;opts, int &amp;x);
    645   template bool read&lt;&gt;(int &amp;);
    646 </pre>
    647 
    648 The standard says that types which don't depend on template parameters
    649 must be complete when a template is defined if they affect the
    650 program's behavior.  However, the standard also says that compilers
    651 are free to not enforce this rule.  Most compilers enforce it to some
    652 extent; for example, it would be an error in GCC to
    653 write <tt>opts.ForceReads</tt> in the code above.  In Clang, we feel
    654 that enforcing the rule consistently lets us provide a better
    655 experience, but unfortunately it also means we reject some code that
    656 other compilers accept.
    657 
    658 <p>We've explained the rule here in very imprecise terms; see
    659 [temp.res]p8 for details.
    660 
    661 <!-- ======================================================================= -->
    662 <h3 id="bad_templates">Templates with no valid instantiations</h3>
    663 <!-- ======================================================================= -->
    664 
    665 The following code contains a typo: the programmer
    666 meant <tt>init()</tt> but wrote <tt>innit()</tt> instead.
    667 
    668 <pre>
    669   template &lt;class T&gt; class Processor {
    670     ...
    671     void init();
    672     ...
    673   };
    674   ...
    675   template &lt;class T&gt; void process() {
    676     Processor&lt;T&gt; processor;
    677     processor.innit();       // <-- should be 'init()'
    678     ...
    679   }
    680 </pre>
    681 
    682 Unfortunately, we can't flag this mistake as soon as we see it: inside
    683 a template, we're not allowed to make assumptions about "dependent
    684 types" like <tt>Processor&lt;T&gt;</tt>.  Suppose that later on in
    685 this file the programmer adds an explicit specialization
    686 of <tt>Processor</tt>, like so:
    687 
    688 <pre>
    689   template &lt;&gt; class Processor&lt;char*&gt; {
    690     void innit();
    691   };
    692 </pre>
    693 
    694 Now the program will work &mdash; as long as the programmer only ever
    695 instantiates <tt>process()</tt> with <tt>T = char*</tt>!  This is why
    696 it's hard, and sometimes impossible, to diagnose mistakes in a
    697 template definition before it's instantiated.
    698 
    699 <p>The standard says that a template with no valid instantiations is
    700 ill-formed.  Clang tries to do as much checking as possible at
    701 definition-time instead of instantiation-time: not only does this
    702 produce clearer diagnostics, but it also substantially improves
    703 compile times when using pre-compiled headers.  The downside to this
    704 philosophy is that Clang sometimes fails to process files because they
    705 contain broken templates that are no longer used.  The solution is
    706 simple: since the code is unused, just remove it.
    707 
    708 <!-- ======================================================================= -->
    709 <h3 id="default_init_const">Default initialization of const variable of a class type requires user-defined default constructor</h3>
    710 <!-- ======================================================================= -->
    711 
    712 If a <tt>class</tt> or <tt>struct</tt> has no user-defined default
    713 constructor, C++ doesn't allow you to default construct a <tt>const</tt>
    714 instance of it like this ([dcl.init], p9):
    715 
    716 <pre>
    717 class Foo {
    718  public:
    719   // The compiler-supplied default constructor works fine, so we
    720   // don't bother with defining one.
    721   ...
    722 };
    723 
    724 void Bar() {
    725   const Foo foo;  // Error!
    726   ...
    727 }
    728 </pre>
    729 
    730 To fix this, you can define a default constructor for the class:
    731 
    732 <pre>
    733 class Foo {
    734  public:
    735   Foo() {}
    736   ...
    737 };
    738 
    739 void Bar() {
    740   const Foo foo;  // Now the compiler is happy.
    741   ...
    742 }
    743 </pre>
    744 
    745 <!-- ======================================================================= -->
    746 <h3 id="param_name_lookup">Parameter name lookup</h3>
    747 <!-- ======================================================================= -->
    748 
    749 <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>
    750 <blockquote>
    751 <pre>
    752 void f(int a, int a);
    753 </pre>
    754 </blockquote>
    755 <p>Clang diagnoses this error (where the parameter name has been redeclared). To fix this problem, rename one of the parameters.</p>
    756 
    757 <!-- ======================================================================= -->
    758 <h2 id="objective-c++">Objective-C++ compatibility</h3>
    759 <!-- ======================================================================= -->
    760 
    761 <!-- ======================================================================= -->
    762 <h3 id="implicit-downcasts">Implicit downcasts</h3>
    763 <!-- ======================================================================= -->
    764 
    765 <p>Due to a bug in its implementation, GCC allows implicit downcasts
    766 of Objective-C pointers (from a base class to a derived class) when
    767 calling functions. Such code is inherently unsafe, since the object
    768 might not actually be an instance of the derived class, and is
    769 rejected by Clang. For example, given this code:</p>
    770 
    771 <pre>
    772 @interface Base @end
    773 @interface Derived : Base @end
    774 
    775 void f(Derived *p);
    776 void g(Base *p) {
    777   f(p);
    778 }
    779 </pre>
    780 
    781 <p>Clang produces the following error:</p>
    782 
    783 <pre>
    784 downcast.mm:6:3: error: no matching function for call to 'f'
    785   f(p);
    786   ^
    787 downcast.mm:4:6: note: candidate function not viable: cannot convert from
    788       superclass 'Base *' to subclass 'Derived *' for 1st argument
    789 void f(Derived *p);
    790      ^
    791 </pre>
    792 
    793 <p>If the downcast is actually correct (e.g., because the code has
    794 already checked that the object has the appropriate type), add an
    795 explicit cast:</p>
    796 
    797 <pre>
    798   f((Derived *)base);
    799 </pre>
    800 
    801 <!-- ======================================================================= -->
    802 <h3 id="class-as-property-name">Using <code>class</code> as a property name</h3>
    803 <!-- ======================================================================= -->
    804 
    805 <p>In C and Objective-C, <code>class</code> is a normal identifier and
    806 can be used to name fields, ivars, methods, and so on.  In
    807 C++, <code>class</code> is a keyword.  For compatibility with existing
    808 code, Clang permits <code>class</code> to be used as part of a method
    809 selector in Objective-C++, but this does not extend to any other part
    810 of the language.  In particular, it is impossible to use property dot
    811 syntax in Objective-C++ with the property name <code>class</code>, so
    812 the following code will fail to parse:</p>
    813 
    814 <pre>
    815 @interface I {
    816 int cls;
    817 }
    818 + (int)class;
    819 @end
    820 
    821 @implementation  I
    822 - (int) Meth { return I.class; }
    823 @end
    824 <pre>
    825 
    826 <p>Use explicit message-send syntax instead, i.e. <code>[I class]</code>.</p>
    827 
    828 </div>
    829 </body>
    830 </html>
    831