<div dir="ltr">On Tue, Oct 29, 2013 at 2:40 PM, Karen Shaeffer <span dir="ltr"><<a href="mailto:shaeffer@neuralscape.com" target="_blank">shaeffer@neuralscape.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5">On Tue, Oct 29, 2013 at 02:14:11PM -0700, Richard Smith wrote:<br>

> On Tue, Oct 29, 2013 at 1:29 AM, Rahul Jain <<a href="mailto:1989.rahuljain@gmail.com">1989.rahuljain@gmail.com</a>>wrote:<br>
><br>
> ><br>
> > Hi all,<br>
> ><br>
> > This is with respect to the following TC.<br>
> ><br>
> > struct S;<br>
> ><br>
> > template <typename T><br>
> > static bool fn (S *s)<br>
> > {<br>
> >   return typeid (*s) == typeid (T);<br>
> > }<br>
> ><br>
> > struct S<br>
> > {<br>
> > };<br>
> ><br>
> > bool x = fn<S> (__null);<br>
> ><br>
> ><br>
> > The standard says:<br>
> > If the type of the type-id is a class type or a reference to a class type,<br>
> > the class shall be completely-defined.<br>
> ><br>
> ><br>
> > This "shall" is kind of confusing. Is this a valid TC. Is forward<br>
> > declaration allowed while using the typeid operator?<br>
> ><br>
><br>
> No, but the rules are slightly different because this occurs inside a<br>
> template. This testcase is ill-formed, but no diagnostic is required, per<br>
> [temp.res](14.6)p8:<br>
><br>
> "If a type used in a non-dependent name is incomplete at the point at which<br>
> a template is defined but is complete at the point at which an<br>
> instantiation is done, and if the completeness of that type affects whether<br>
> or not the program is well-formed or affects the semantics of the program,<br>
> the program is ill-formed; no diagnostic is required."<br>
><br>
> So the template has no valid specializations. Further, we're allowed to<br>
> reject this even if the template is never instantiated:<br>
><br>
> "If no valid specialization can be generated for a template, and that<br>
> template is not instantiated, the template is ill-formed, no diagnostic<br>
> required."<br>
><br>
<br>
</div></div>Hi Richard,<br>
There is no ambiguity there. The standard defines it concisely. I actually thought<br>
whether a compiler rejected that example was implementation specific, depending on<br>
the compiler's template instantiation stategy. But c++11 defines it as an ill-formed<br>
program. Is that test case an ill-formed program in the previous standard?<br></blockquote></div><br></div><div class="gmail_extra">The wording was added by DR206 in response to the ambiguity in the original (C++98) spec. Since this was a DR, it retroactively applies to C++98 too, so this code has (in some sense) always been ill-formed, with no diagnostic required:</div>
<div class="gmail_extra"><br></div><div class="gmail_extra"><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#206">http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#206</a><br></div><div class="gmail_extra">
<br></div><div class="gmail_extra">I'm not sure what you're talking about when you mention ambiguity.</div></div>