[PATCH] D26226: Don't require nullability on template parameters in typedefs.
Jordan Rose via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 1 18:27:40 PDT 2016
jordan_rose created this revision.
jordan_rose added reviewers: doug.gregor, rsmith.
jordan_rose added a subscriber: cfe-commits.
jordan_rose set the repository for this revision to rL LLVM.
Previously the following code would warn on the use of `T`:
template <typename T>
struct X {
typedef T *type;
};
...because nullability is //allowed// on template parameters (because they could be pointers). (Actually putting nullability on this use of `T` will of course break if the argument is a non-pointer type.)
This fix doesn't handle the case where a template parameter is used //outside// of a typedef. That seems trickier, especially in parameter position.
Repository:
rL LLVM
https://reviews.llvm.org/D26226
Files:
lib/Sema/SemaType.cpp
test/SemaObjCXX/Inputs/nullability-consistency-1.h
Index: test/SemaObjCXX/Inputs/nullability-consistency-1.h
===================================================================
--- test/SemaObjCXX/Inputs/nullability-consistency-1.h
+++ test/SemaObjCXX/Inputs/nullability-consistency-1.h
@@ -13,5 +13,13 @@
int X:: *memptr; // expected-warning{{member pointer is missing a nullability type specifier}}
};
+template <typename T>
+struct Typedefs {
+ typedef T *Base; // no-warning
+ typedef Base *type; // expected-warning{{pointer is missing a nullability type specifier}}
+};
+
+Typedefs<int> xx;
+Typedefs<void *> yy;
Index: lib/Sema/SemaType.cpp
===================================================================
--- lib/Sema/SemaType.cpp
+++ lib/Sema/SemaType.cpp
@@ -3662,7 +3662,15 @@
// inner pointers.
complainAboutMissingNullability = CAMN_InnerPointers;
- if (T->canHaveNullability() && !T->getNullability(S.Context)) {
+ auto isDependentNonPointerType = [](QualType T) -> bool {
+ // FIXME: This just duplicates logic inside Type::canHaveNullability.
+ return T->isDependentType() && !T->isAnyPointerType() &&
+ !T->isBlockPointerType() && !T->isMemberPointerType();
+ };
+
+ if (T->canHaveNullability() && !T->getNullability(S.Context) &&
+ !isDependentNonPointerType(T)) {
+ // Note that we allow but don't require nullability on dependent types.
++NumPointersRemaining;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D26226.76663.patch
Type: text/x-patch
Size: 1414 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161102/89aad940/attachment-0001.bin>
More information about the cfe-commits
mailing list