Author: kremenek
Date: Fri Aug 14 19:51:46 2009
New Revision: 79060
URL: http://llvm.org/viewvc/llvm-project?rev=79060&view=rev
Log:
Change handling of attribute 'malloc' to only accept the attribute on function
declarations (and not function pointers). This is consistent with GCC. Accepting
this attribute on function pointers means that the attribute should be treated
as a type qualifier, which apparently is not what GCC does. We obviously can
change this later should we desire to enhance the 'malloc' attribute in this
way.
Modified:
cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
cfe/trunk/lib/Sema/SemaDeclAttr.cpp
cfe/trunk/test/Sema/attr-malloc.c
cfe/trunk/test/SemaObjC/attr-malloc.m
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=79060&r1=79059&r2=79060&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Aug 14 19:51:46
2009
@@ -612,7 +612,7 @@
def warn_attribute_nonnull_no_pointers : Warning<
"'nonnull' attribute applied to function with no pointer arguments">;
def warn_attribute_malloc_pointer_only : Warning<
- "'malloc' attribute only applies to functions returning pointer type">;
+ "'malloc' attribute only applies to functions returning a pointer type">;
def warn_transparent_union_nonpointer : Warning<
"'transparent_union' attribute support incomplete; only supported for "
"pointer unions">;
Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=79060&r1=79059&r2=79060&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Fri Aug 14 19:51:46 2009
@@ -438,22 +438,15 @@
return;
}
- const FunctionType *FT = getFunctionType(d, false);
-
- if (!FT) {
- S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
- << Attr.getName() << 0 /*function*/;
- return;
- }
-
- QualType RetTy = FT->getResultType();
-
- if (!(RetTy->isAnyPointerType() || RetTy->isBlockPointerType())) {
- S.Diag(Attr.getLoc(), diag::warn_attribute_malloc_pointer_only);
- return;
+ if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(d)) {
+ QualType RetTy = FD->getResultType();
+ if (RetTy->isAnyPointerType() || RetTy->isBlockPointerType()) {
+ d->addAttr(::new (S.Context) MallocAttr());
+ return;
+ }
}
- d->addAttr(::new (S.Context) MallocAttr());
+ S.Diag(Attr.getLoc(), diag::warn_attribute_malloc_pointer_only);
}
static bool HandleCommonNoReturnAttr(Decl *d, const AttributeList &Attr,
Modified: cfe/trunk/test/Sema/attr-malloc.c
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-malloc.c?rev=79060&r1=79059&r2=79060&view=diff
==============================================================================
--- cfe/trunk/test/Sema/attr-malloc.c (original)
+++ cfe/trunk/test/Sema/attr-malloc.c Fri Aug 14 19:51:46 2009
@@ -3,16 +3,16 @@
#include <stdlib.h>
-int no_vars __attribute((malloc)); // expected-warning {{only applies to
function types}}
+int no_vars __attribute((malloc)); // expected-warning {{functions returning a
pointer type}}
-void returns_void (void) __attribute((malloc)); // expected-warning
{{functions returning pointer type}}
-int returns_int (void) __attribute((malloc)); // expected-warning
{{functions returning pointer type}}
+void returns_void (void) __attribute((malloc)); // expected-warning
{{functions returning a pointer type}}
+int returns_int (void) __attribute((malloc)); // expected-warning
{{functions returning a pointer type}}
int * returns_intptr(void) __attribute((malloc)); // no-warning
typedef int * iptr;
iptr returns_iptr (void) __attribute((malloc)); // no-warning
-__attribute((malloc)) void *(*f)(); // no-warning
-__attribute((malloc)) int (*g)(); // expected-warning{{'malloc' attribute only
applies to functions returning pointer type}}
+__attribute((malloc)) void *(*f)(); // expected-warning{{'malloc' attribute
only applies to functions returning a pointer type}}
+__attribute((malloc)) int (*g)(); // expected-warning{{'malloc' attribute only
applies to functions returning a pointer type}}
__attribute((malloc))
void * xalloc(unsigned n) { return malloc(n); } // no-warning
Modified: cfe/trunk/test/SemaObjC/attr-malloc.m
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/attr-malloc.m?rev=79060&r1=79059&r2=79060&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/attr-malloc.m (original)
+++ cfe/trunk/test/SemaObjC/attr-malloc.m Fri Aug 14 19:51:46 2009
@@ -1,8 +1,8 @@
// RUN: clang-cc -verify -fsyntax-only -fblocks %s
@interface TestAttrMallocOnMethods {}
-- (id) test1 __attribute((malloc)); // expected-warning{{'malloc' attribute
only applies to function types}}
-- (int) test2 __attribute((malloc)); // expected-warning{{'malloc' attribute
only applies to function types}}
+- (id) test1 __attribute((malloc)); // expected-warning {{functions returning
a pointer type}}
+- (int) test2 __attribute((malloc)); // expected-warning {{functions
returning a pointer type}}
@end
id bar(void) __attribute((malloc)); // no-warning
@@ -10,6 +10,7 @@
typedef void (^bptr)(void);
bptr baz(void) __attribute((malloc)); // no-warning
-__attribute((malloc)) id (*f)(); // no-warning
-__attribute((malloc)) bptr (*g)(); // no-warning
+__attribute((malloc)) id (*f)(); // expected-warning {{functions returning a
pointer type}}
+__attribute((malloc)) bptr (*g)(); // expected-warning {{functions returning
a pointer type}}
+__attribute((malloc)) void *(^h)(); // expected-warning {{functions returning
a pointer type}}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits