<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Oct 21, 2014 at 3:38 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>></span> wrote:<br><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"><span class="">>>! In D5690#13, @rsmith wrote:<br>
> Two more things I'd like to see tested:<br>
><br>
> 1: Explicit instantiation of a class should presumably *not* instantiate default initializers unless they're actually used by some constructor that is explicitly instantiated. For instance:<br>
><br>
>     template<typename T> struct X {<br>
>       X();<br>
>       int n = T::error;<br>
>     };<br>
>     template struct X<int>; // ok<br>
>     template<typename T> X<T>::X() {}<br>
>     template struct X<float>; // error in instantiation of X<float>::n's initializer from X<float>::X()<br>
<br>
</span>OK, that works.<br>
<span class=""><br>
> 2: Instantiation of a function with a local class should always instantiate the default initializers, even if they're not used. For instance:<br>
><br>
>     template<typename T> void f() {<br>
>       struct X {<br>
>         int n = T::error;<br>
>       };<br>
>     }<br>
>     void g() { f<int>(); } // error<br>
<br>
</span>I can probably go add this logic, but what's the reason?</blockquote><div><br></div><div>See <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1484">http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1484</a><br></div><div><br></div><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"><span class="">
================<br>
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:6194-6195<br>
@@ +6193,4 @@<br>
+    : Error<"cannot use defaulted default constructor of %0 within the class "<br>
+            "outside of member functions due to non-static data member "<br>
+            "initializer for %1">;<br>
+def err_in_class_initializer_not_yet_parsed_outer_class<br>
----------------<br>
</span><span class="">rsmith wrote:<br>
> "non-static data member initializer" is a term the GCC folks made up; I don't like it =) How about:<br>
><br>
>     "... because %1 has an initializer"?<br>
</span>Sure, but see the other template instantiation note which uses this terminology.<br>
<br>
<a href="http://reviews.llvm.org/D5690" target="_blank">http://reviews.llvm.org/D5690</a><br>
<br>
<br>
</blockquote></div><br></div></div>