summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclAttr.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-09-01 19:57:52 +0000
committerTed Kremenek <kremenek@apple.com>2008-09-01 19:57:52 +0000
commitc4f6d90ba1973853295737b5ba179ee8ae4db37a (patch)
tree4c64ee5348675a294e9b26292b3ca77e8c2c603a /clang/lib/Sema/SemaDeclAttr.cpp
parent2c5208c59fcdae2e47fe8f98e6506bb098ea2005 (diff)
downloadbcm5719-llvm-c4f6d90ba1973853295737b5ba179ee8ae4db37a.tar.gz
bcm5719-llvm-c4f6d90ba1973853295737b5ba179ee8ae4db37a.zip
Tidy up sema processing of attribute "nonull":
- warn about nonnull being applied to functions with no pointer arguments - continue processing argument list in the attribute when we encounter a non-pointer parameter being marked as nonnull - when no argument list is specified, only mark pointers as nonnull. This fixes PR 2732 and radar 6188814. llvm-svn: 55610
Diffstat (limited to 'clang/lib/Sema/SemaDeclAttr.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp28
1 files changed, 20 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index f94711e987c..eb9888e9a28 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -282,20 +282,32 @@ static void HandleNonNullAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// FIXME: Should also highlight argument in decl.
S.Diag(Attr.getLoc(), diag::err_nonnull_pointers_only,
"nonnull", Ex->getSourceRange());
- return;
+ continue;
}
NonNullArgs.push_back(x);
}
- if (!NonNullArgs.empty()) {
- unsigned* start = &NonNullArgs[0];
- unsigned size = NonNullArgs.size();
- std::sort(start, start + size);
- d->addAttr(new NonNullAttr(start, size));
+ // If no arguments were specified to __attribute__((nonnull)) then all
+ // pointer arguments have a nonnull attribute.
+ if (NonNullArgs.empty()) {
+ unsigned idx = 0;
+
+ for (FunctionTypeProto::arg_type_iterator
+ I=proto->arg_type_begin(), E=proto->arg_type_end(); I!=E; ++I, ++idx)
+ if ((*I)->isPointerType())
+ NonNullArgs.push_back(idx);
+
+ if (NonNullArgs.empty()) {
+ S.Diag(Attr.getLoc(), diag::warn_attribute_nonnull_no_pointers);
+ return;
+ }
}
- else
- d->addAttr(new NonNullAttr());
+
+ unsigned* start = &NonNullArgs[0];
+ unsigned size = NonNullArgs.size();
+ std::sort(start, start + size);
+ d->addAttr(new NonNullAttr(start, size));
}
static void HandleAliasAttr(Decl *d, const AttributeList &Attr, Sema &S) {
OpenPOWER on IntegriCloud