diff options
| author | Ted Kremenek <kremenek@apple.com> | 2008-09-01 19:57:52 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2008-09-01 19:57:52 +0000 |
| commit | c4f6d90ba1973853295737b5ba179ee8ae4db37a (patch) | |
| tree | 4c64ee5348675a294e9b26292b3ca77e8c2c603a /clang/lib/Sema/SemaDeclAttr.cpp | |
| parent | 2c5208c59fcdae2e47fe8f98e6506bb098ea2005 (diff) | |
| download | bcm5719-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.cpp | 28 |
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) { |

