<div dir="ltr">On Tue, Oct 21, 2014 at 7:52 PM, Richard Trieu <span dir="ltr"><<a href="mailto:rtrieu@google.com" target="_blank">rtrieu@google.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rtrieu<br>
Date: Tue Oct 21 21:52:00 2014<br>
New Revision: 220363<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=220363&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=220363&view=rev</a><br>
Log:<br>
Disable the uninitialized field warning in uninstantiated classes.<br>
<br>
If a templated class is not instantiated, then the AST for it could be missing<br>
some things that would throw the field checker off.  Wait until specialization<br>
before emitting these warnings.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp<br>
    cfe/trunk/test/SemaCXX/uninitialized.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=220363&r1=220362&r2=220363&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=220363&r1=220362&r2=220363&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Tue Oct 21 21:52:00 2014<br>
@@ -2525,6 +2525,9 @@ namespace {<br>
<br>
     const CXXRecordDecl *RD = Constructor->getParent();<br>
<br>
+    if (RD->getDescribedClassTemplate() != nullptr)<br>
+      return;<br>
+<br></blockquote><div><br></div><div>Isn't the LLVM style to not explicitly check for nullptr?</div><div><br></div><div>That is:</div><div><br></div><div>  if (!RD->getDescribedClassTemplate())</div><div>    return;</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
     // Holds fields that are uninitialized.<br>
     llvm::SmallPtrSet<ValueDecl*, 4> UninitializedFields;<br>
<br>
<br>
Modified: cfe/trunk/test/SemaCXX/uninitialized.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/uninitialized.cpp?rev=220363&r1=220362&r2=220363&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/uninitialized.cpp?rev=220363&r1=220362&r2=220363&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/SemaCXX/uninitialized.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/uninitialized.cpp Tue Oct 21 21:52:00 2014<br>
@@ -1220,3 +1220,46 @@ namespace init_list {<br>
     {}<br>
   };<br>
 }<br>
+<br>
+namespace template_class {<br>
+class Foo {<br>
+ public:<br>
+    int *Create() { return nullptr; }<br>
+};<br>
+<br>
+template <typename T><br>
+class A {<br>
+public:<br>
+  // Don't warn on foo here.<br>
+  A() : ptr(foo->Create()) {}<br>
+<br>
+private:<br>
+  Foo *foo = new Foo;<br>
+  int *ptr;<br>
+};<br>
+<br>
+template <typename T><br>
+class B {<br>
+public:<br>
+  // foo is uninitialized here, but class B is never instantiated.<br>
+  B() : ptr(foo->Create()) {}<br>
+<br>
+private:<br>
+  Foo *foo;<br>
+  int *ptr;<br>
+};<br>
+<br>
+template <typename T><br>
+class C {<br>
+public:<br>
+  C() : ptr(foo->Create()) {}<br>
+  // expected-warning@-1 {{field 'foo' is uninitialized when used here}}<br>
+private:<br>
+  Foo *foo;<br>
+  int *ptr;<br>
+};<br>
+<br>
+C<int> c;<br>
+// expected-note@-1 {{in instantiation of member function 'template_class::C<int>::C' requested here}}<br>
+<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org
</div></div>