[PATCH] Enhanced ignored-qualifiers checks for restrict
hfinkel at anl.gov
hfinkel at anl.gov
Mon Oct 20 13:05:55 PDT 2014
Hi rsmith, dberlin, aaron.ballman,
We already include the restrict qualifier in the -Wignored-qualifiers checks, and so we'll produce a warning when -Wignored-qualifiers is in effect for a function declared with a restrict-qualified return type:
warning: 'restrict' type qualifier on return type has no effect [-Wignored-qualifiers]
int * restrict f8a(void);
^~~~~~~~~
but we don't warn about restrict-qualified types being used a return types generally. We also don't warn about restrict-qualified types in case expressions (which also don't convey any pointer-aliasing information because of how restrict's semantics are defined).
restrict's semantics are subtle, and there is a lot of misunderstanding about exactly how restrict can be used. Users often believe they can put restrict on function return types and in cast expressions to express pointer-aliasing information, and they can't (although the resulting code is legal).
This patch does two things. First, it adds a warning about indirectly-restrict-qualified function return types. For example, the code:
typedef float * restrict floatp;
typedef floatp realp;
realp f8c(void);
will yield (when compiling with -Wignored-qualifiers):
warning: restrict-qualified function return type has no effect [-Wignored-qualifiers]
realp f8c(void);
^~~~~
note: 'realp' declared here
typedef floatp realp;
^
note: 'floatp' declared here
typedef float * restrict floatp;
^
(the patch adds code that tries to look back through a chain of typedefs to find where the restrict was introduced, and then produces a corresponding series of notes, hopefully making it easy for the user to see where the restrict is coming from).
Second, we add a corresponding warning for restrict in case expressions, like this:
extern int *r, *q;
r = (int * restrict)q;
for(i=0; i<100; i++)
*(int * restrict)p++ = r[i];
will yield:
warning: restrict-qualified type in a cast expression has no effect [-Wignored-qualifiers]
r = (int * restrict)q;
^~~~~~~~~~~~~~
warning: restrict-qualified type in a cast expression has no effect [-Wignored-qualifiers]
*(int * restrict)p++ = r[i];
^~~~~~~~~~~~~~
One remaining problem (and I'm not sure how to best solve this), the cast warning should not fire when the cast is the top-level expression on the RHS of an assignment, and the cast is making the assignment legal. Suggestions here would be greatly appreciated.
Thanks again!
http://reviews.llvm.org/D5872
Files:
include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Sema/Sema.h
lib/Sema/SemaDecl.cpp
lib/Sema/SemaType.cpp
test/Sema/restrict.c
test/SemaCXX/restrict.cpp
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D5872.15151.patch
Type: text/x-patch
Size: 6076 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141020/388f7a53/attachment.bin>
More information about the cfe-commits
mailing list