<div dir="auto"><div><div class="gmail_extra"><div class="gmail_quote">On 2 Nov 2016 1:53 pm, "Jordan Rose via cfe-commits" <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: jrose<br>
Date: Wed Nov  2 15:44:07 2016<br>
New Revision: 285856<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=285856&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=285856&view=rev</a><br>
Log:<br>
Don't require nullability on template parameters in typedefs.<br>
<br>
Previously the following code would warn on the use of "T":<br>
<br>
  template <typename T><br>
  struct X {<br>
    typedef T *type;<br>
  };<br>
<br>
...because nullability is /allowed/ on template parameters (because<br>
they could be pointers). (Actually putting nullability on this use of<br>
'T' will of course break if the argument is a non-pointer type.)<br></blockquote></div></div></div><div><br></div><div>This doesn't make any sense to me. Why would T need to be a pointer type for a nullability qualifier to be valid on a T*?</div><div><br></div><div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This fix doesn't handle the case where a template parameter is used<br>
/outside/ of a typedef. That seems trickier, especially in parameter<br>
position.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/SemaType.<wbr>cpp<br>
    cfe/trunk/test/SemaObjCXX/<wbr>Inputs/nullability-<wbr>consistency-1.h<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaType.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=285856&r1=285855&r2=285856&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaType.cpp?rev=285856&r1=<wbr>285855&r2=285856&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/SemaType.<wbr>cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaType.<wbr>cpp Wed Nov  2 15:44:07 2016<br>
@@ -3600,7 +3600,17 @@ static TypeSourceInfo *GetFullTypeForDec<br>
     // inner pointers.<br>
     complainAboutMissingNullabilit<wbr>y = CAMN_InnerPointers;<br>
<br>
-    if (T->canHaveNullability() && !T->getNullability(S.Context)) {<br>
+    auto isDependentNonPointerType = [](QualType T) -> bool {<br>
+      // Note: This is intended to be the same check as Type::canHaveNullability<br>
+      // except with all of the ambiguous cases being treated as 'false' rather<br>
+      // than 'true'.<br>
+      return T->isDependentType() && !T->isAnyPointerType() &&<br>
+        !T->isBlockPointerType() && !T->isMemberPointerType();<br>
+    };<br>
+<br>
+    if (T->canHaveNullability() && !T->getNullability(S.Context) &&<br>
+        !isDependentNonPointerType(T)) {<br>
+      // Note that we allow but don't require nullability on dependent types.<br>
       ++NumPointersRemaining;<br>
     }<br>
<br>
<br>
Modified: cfe/trunk/test/SemaObjCXX/<wbr>Inputs/nullability-<wbr>consistency-1.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/Inputs/nullability-consistency-1.h?rev=285856&r1=285855&r2=285856&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaObjCXX/Inputs/nullability-<wbr>consistency-1.h?rev=285856&r1=<wbr>285855&r2=285856&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaObjCXX/<wbr>Inputs/nullability-<wbr>consistency-1.h (original)<br>
+++ cfe/trunk/test/SemaObjCXX/<wbr>Inputs/nullability-<wbr>consistency-1.h Wed Nov  2 15:44:07 2016<br>
@@ -13,5 +13,13 @@ class X {<br>
   int X:: *memptr; // expected-warning{{member pointer is missing a nullability type specifier}}<br>
 };<br>
<br>
+template <typename T><br>
+struct Typedefs {<br>
+  typedef T *Base; // no-warning<br>
+  typedef Base *type; // expected-warning{{pointer is missing a nullability type specifier}}<br>
+};<br>
+<br>
+Typedefs<int> xx;<br>
+Typedefs<void *> yy;<br>
<br>
<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div></div>