[cfe-commits] [Patch] Fix -Wignored-qualifiers
Chandler Carruth
chandlerc at google.com
Wed Feb 23 10:30:56 PST 2011
This looks fine to me, do you have commit access, or shall I commit for you?
On Wed, Feb 23, 2011 at 10:17 AM, Hans Wennborg <hans at chromium.org> wrote:
> Thank you both for the input!
>
> On Wed, Feb 23, 2011 at 6:00 PM, Douglas Gregor <dgregor at apple.com> wrote:
> >
> > On Feb 23, 2011, at 9:23 AM, Chandler Carruth wrote:
> >
> >> One overall concern I would have is that a parser struct is quadrupling
> in size. Can you measure the peak memory usage impact of this change on a
> hefty compilation?
> >
> > It shouldn't have any effect whatsoever, since PointerTypeInfo is only
> used when it's in a union with the much-larger FunctionTypeInfo.
> Great, I won't worry about that then.
>
> >> Some nits below...
> >>
> >> Index: test/SemaCXX/return.cpp
> >> ===================================================================
> >> --- test/SemaCXX/return.cpp (revision 126218)
> >> +++ test/SemaCXX/return.cpp (working copy)
> >> @@ -24,5 +24,14 @@
> >> const volatile S class_cv();
> >>
> >> const int scalar_c(); // expected-warning{{'const' type qualifier on
> return type has no effect}}
> >> +
> >> +const
> >> +char*
> >> +const // expected-warning{{'const' type qualifier on return type has no
> effect}}
> >> +f();
> >>
> >> It would be good to test "T const" and "T const * const" as well for
> completeness...
> Adding that.
>
> >>
> >> Index: include/clang/Sema/DeclSpec.h
> >> ===================================================================
> >> --- include/clang/Sema/DeclSpec.h (revision 126218)
> >> +++ include/clang/Sema/DeclSpec.h (working copy)
> >> @@ -825,6 +825,25 @@
> >> struct PointerTypeInfo : TypeInfoCommon {
> >> /// The type qualifiers: const/volatile/restrict.
> >> unsigned TypeQuals : 3;
> >> +
> >> + /// The location of the const-qualifier, if any.
> >> + unsigned ConstQualLoc;
> >> +
> >> + /// The location of the volatile-qualifier, if any.
> >> + unsigned VolatileQualLoc;
> >> +
> >> + /// The location of the restrict-qualifier, if any.
> >> + unsigned RestrictQualLoc;
> >> +
> >> + SourceLocation constQualLoc() const {
> >> + return SourceLocation::getFromRawEncoding(ConstQualLoc);
> >> + }
> >> + SourceLocation volatileQualLoc() const {
> >> + return SourceLocation::getFromRawEncoding(VolatileQualLoc);
> >> + }
> >> + SourceLocation restrictQualLoc() const {
> >> + return SourceLocation::getFromRawEncoding(RestrictQualLoc);
> >> + }
> >>
> >> I find the getters here a bit odd. As these are only accessed on one
> place, I wonder if we should do the raw encoding -> SourceLocation
> transition there.
> You're right. I'll remove the getters.
>
> >>
> >> Perhaps most odd to me is that the members are public and doxymented,
> but they have non-trivial getters and those aren't doxymented. If you want
> getters on this struct, I'd make the members private and move the comments.
> >>
> >> Index: lib/Sema/SemaType.cpp
> >> ===================================================================
> >> --- lib/Sema/SemaType.cpp (revision 126218)
> >> +++ lib/Sema/SemaType.cpp (working copy)
> >> @@ -1395,6 +1395,49 @@
> >> return QT;
> >> }
> >>
> >> +static void DiagnoseIgnoredQualifiers(unsigned Quals,
> >> + SourceLocation constQualLoc,
> >> + SourceLocation volatileQualLoc,
> >> + SourceLocation restrictQualLoc,
> >> + Sema& S) {
> >> + std::string QualStr;
> >> + unsigned NumQuals = 0;
> >> + SourceLocation Loc;
> >> +
> >> + if (Quals & Qualifiers::Const) {
> >> + Loc = constQualLoc;
> >> + ++NumQuals;
> >> + QualStr = "const";
> >> + }
> >> + if (Quals & Qualifiers::Volatile) {
> >> + if (NumQuals == 0) {
> >> + Loc = volatileQualLoc;
> >> + QualStr = "volatile";
> >> + } else
> >> + QualStr += " volatile";
> >>
> >> I think this section is moved verbatim, but while we're here, can we
> have {}s around this else block? Especially followed by a preincrement, I
> had to read in 3 times...
> Done.
>
> >>
> >> + ++NumQuals;
> >> + }
> >> + if (Quals & Qualifiers::Restrict) {
> >> + if (NumQuals == 0) {
> >> + Loc = restrictQualLoc;
> >> + QualStr = "restrict";
> >> + } else
> >> + QualStr += " restrict";
> >>
> >> Same here.
> Done.
>
> >>
> >> + ++NumQuals;
> >> + }
> >> +
> >> + assert(NumQuals > 0 && "No known qualifiers?");
> >> + Sema::SemaDiagnosticBuilder DB = S.Diag(Loc,
> diag::warn_qual_return_type);
> >> +
> >> + DB << QualStr << NumQuals;
> >> + if (Quals & Qualifiers::Const)
> >> + DB << FixItHint::CreateRemoval(constQualLoc);
> >> + if (Quals & Qualifiers::Volatile)
> >> + DB << FixItHint::CreateRemoval(volatileQualLoc);
> >> + if (Quals & Qualifiers::Restrict)
> >> + DB << FixItHint::CreateRemoval(restrictQualLoc);
> >>
> >> And I think we simplify this by having three empty FixItHint variable,
> and initializing them in each branch where we do the original checking. That
> should also avoid the need to store the diagnostic builder, and we can just
> stream the lot of this in directly.
> Ah, yes that makes it nicer.
>
>
> Attaching new patch addressing Chandler's comments.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110223/5d3142df/attachment.html>
More information about the cfe-commits
mailing list