 <p>There's surprisingly little in the standard about this. About all we hear about redeclaration is:</p> <blockquote> <p><code>[C++11: 3.1/1]:</code> A declaration (Clause 7) may introduce one or more names into a translation unit or redeclare names introduced by previous declarations. <em>[..]</em></p> </blockquote> <p>and the only relevant part of <code>auto</code>'s semantics:</p> <blockquote> <p><code>[C++11: 7.1.6.4/3]:</code> Otherwise, the type of the variable is deduced from its initializer. <em>[..]</em></p> </blockquote> <p>(reminding us that the type of <code>x</code> is <code>int</code>).</p> <p>We know that a variable must be given the same type by all declarations:</p> <blockquote> <p><code>[C++11: 3.5/10]:</code> After all adjustments of types (during which typedefs (7.1.3) are replaced by their definitions), <strong>the types specified by all declarations referring to a given variable or function shall be identical</strong>, except that declarations for an array object can specify array types that differ by the presence or absence of a major array bound (8.3.4). A violation of this rule on type identity does not require a diagnostic.</p> </blockquote> <p>and the "after all adjustments of types" ought to take care of any questions regarding <code>auto</code>'s participation in all of this; my interpretation, then, is that <strong>this is inherently a valid redeclaration (and definition) of the <code>x</code> at global scope with type <code>int</code>, and that Clang is correct</strong>. Even if we propose that <code>auto</code> does not count as "adjustment of type", since no diagnostic is required, at worst <em>all</em> listed implementations are compliant in their own way.</p> <p>I believe GCC and Visual Studio are taking the following as inspiration:</p> <blockquote> <p><code>[C++11: 7.1.6.4/5]:</code> A program that uses <code>auto</code> in a context not explicitly allowed in this section is ill-formed.</p> </blockquote> <p>&hellip;but I think that this is short-sighted. It seems unlikely that the standard language is intended to prohibit the usual redeclaration rules, just because they are not repeated or explicitly referenced from within <code>7.1.6.4</code>.</p> <p>C++14 adds wording that relates to declarations of <em>functions</em> with deduced types:</p> <blockquote> <p><code>[C++14: 7.1.6.4/13]:</code> Redeclarations or specializations of a function or function template with a declared return type that uses a placeholder type shall also use that placeholder, not a deduced type. <em>[..]</em></p> </blockquote> <p>By symmetry one might suggest that, in your <code>int</code> case, it is intended that GCC and VS be correct in rejecting the program. However, this is a different feature (since deduction cannot be applied to mere declarations) and thus a different scenario.</p> <p>Either way, improved standard wording would help here. I consider it a [reasonably minor] editorial defect.</p>