Keyboard Shortcuts

File
u :up to issue
m :publish + mail comments
M :edit review message
j / k :jump to file after / before current file
J / K :jump to next file with a comment after / before current file
Side-by-side diff
i :toggle intra-line diffs
e :expand all comments
c :collapse all comments
s :toggle showing all comments
n / p :next / previous diff chunk or comment
N / P :next / previous comment
<Up> / <Down> :next / previous line
<Enter> :respond to / edit current comment
d :mark current comment as done
Issue
u :up to list of issues
m :publish + mail comments
j / k :jump to patch after / before current patch
o / <Enter> :open current patch in side-by-side view
i :open current patch in unified diff view
Issue List
j / k :jump to issue after / before current issue
o / <Enter> :open current issue
# : close issue
Comment/message editing
<Ctrl> + s or <Ctrl> + Enter :save comment
<Esc> :cancel edit
Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(40)
Issues Repositories Search
Open Issues | Closed Issues | All Issues | Sign in with your Google Account to create issues and add comments

Issue 4929043: Restart handling of a function declarator if the function name was typo-corrected

Can't Edit
Can't Publish+Mail
Start Review
Created:
14 years, 4 months ago by Kaelyn
Modified:
14 years, 4 months ago
Reviewers:
chandlerc1, dgregor, chandlerc, jediknil
CC:
cfe-commits_cs.uiuc.edu
Base URL:
https://llvm.org/svn/llvm-project/cfe/trunk/
Visibility:
Public.
Not sure if this is the right way (without a major rewrite of Sema::CorrectTypo and friends) to achieve the goal, but it solves the issue brought up by Jordy in response to r137966 where an out-of-line function definition is not rechecked against existing declarations to see if it is valid after being typo-corrected.

Patch Set 1 #

Patch Set 2 : Only accept a typo correction and redo ActOnFunctionDeclarator if doing so doesn't trigger errors #

Total comments: 10

Patch Set 3 : Pack the extra args for calling ActOnFunctionDeclarator into a struct, and add some comments #

Total comments: 1

Patch Set 4 : Pack the extra args for calling ActOnFunctionDeclarator into a struct, and add some comments #

Created: 14 years, 4 months ago
Download [raw] [tar.bz2]
Unified diffs Side-by-side diffs Delta from patch set Stats (+105 lines, -29 lines) Patch
M lib/Sema/SemaDecl.cpp View 1 2 3 6 chunks +101 lines, -28 lines 0 comments Download
M test/SemaCXX/function-redecl.cpp View 1 2 chunks +4 lines, -1 line 0 comments Download
Total messages: 12
|
Kaelyn
14 years, 4 months ago (2011年08月19日 20:47:05 UTC) #1
Sign in to reply to this message.
jediknil_belkadan.com
I'm not a fan of emitting errors for code the user didn't write, but I'd ...
14 years, 4 months ago (2011年08月21日 05:34:17 UTC) #2
I'm not a fan of emitting errors for code the user didn't write, but I'd be okay
with it if there was a fixit for the presence or absence of 'const' as well.
Then we could make a two-step recovery.
Actually, a fixit for const mismatches is probably a good idea anyway...
Jordy
On Aug 19, 2011, at 13:47, rikka@google.com wrote:
> Reviewers: chandlerc,
> 
> Description:
> Not sure if this is the right way (without a major rewrite of
> Sema::CorrectTypo and friends) to achieve the goal, but it solves the
> issue brought up by Jordy in response to r137966 where an out-of-line
> function definition is not rechecked against existing declarations to
> see if it is valid after being typo-corrected.
> 
> Please review this at http://codereview.appspot.com/4929043/
> 
> Affected files:
> M lib/Sema/SemaDecl.cpp
> M test/SemaCXX/function-redecl.cpp
> 
> 
> <issue_4929043_patch.diff>_______________________________________________
> cfe-commits mailing list
> cfe-commits@cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
Sign in to reply to this message.
Kaelyn
I agree that a fixit for const mismatches would be nice too, but the focus ...
14 years, 4 months ago (2011年08月22日 16:30:45 UTC) #3
I agree that a fixit for const mismatches would be nice too, but the focus
of this patch is to address the situation where a function name is mistyped
and there is some other mismatch (such as const) that would cause the
typo-corrected function name to still not match an existing function
declaration. Right now clang will correct the typo but not let the user know
that there is still a problem (this is also not the only case where typo
correction can expose/generate additional error messages).
Cheers,
Kaelyn
On Sat, Aug 20, 2011 at 10:34 PM, Jordy Rose <jediknil@belkadan.com> wrote:
> I'm not a fan of emitting errors for code the user didn't write, but I'd be
> okay with it if there was a fixit for the presence or absence of 'const' as
> well. Then we could make a two-step recovery.
>
> Actually, a fixit for const mismatches is probably a good idea anyway...
>
> Jordy
>
>
> On Aug 19, 2011, at 13:47, rikka@google.com wrote:
>
> > Reviewers: chandlerc,
> >
> > Description:
> > Not sure if this is the right way (without a major rewrite of
> > Sema::CorrectTypo and friends) to achieve the goal, but it solves the
> > issue brought up by Jordy in response to r137966 where an out-of-line
> > function definition is not rechecked against existing declarations to
> > see if it is valid after being typo-corrected.
> >
> > Please review this at http://codereview.appspot.com/4929043/
> >
> > Affected files:
> > M lib/Sema/SemaDecl.cpp
> > M test/SemaCXX/function-redecl.cpp
> >
> >
> > <issue_4929043_patch.diff>_______________________________________________
> > cfe-commits mailing list
> > cfe-commits@cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
Sign in to reply to this message.
Kaelyn
14 years, 4 months ago (2011年08月24日 19:57:58 UTC) #4
Sign in to reply to this message.
Kaelyn
Rietveld's upload.py seems to not have included the patch or description when I used it ...
14 years, 4 months ago (2011年08月24日 20:07:16 UTC) #5
Rietveld's upload.py seems to not have included the patch or description
when I used it to upload a new patchset to an existing issue. :'(
The new patch makes use of SFINAETrap to only accept a typo correction and
restart the function declaration handling if doing so doesn't trigger
additional errors--so no correcting to a declaration with mismatched const
qualifiers, etc. While adding the SFINAETrap usage, I also renamed
isNearlyMatchingFunction to hasSimilarParameters as I kept having to go look
at its body to remember if it checks anything about the two function
declarations other than the parameter list. I figured hasSimilarParameters
was a much better name for a function that checked if two FunctionDecls take
the same number of parameters and that the types of the parameters in each
position are the same or nearly so.
Cheers,
Kaelyn
On Wed, Aug 24, 2011 at 12:57 PM, <rikka@google.com> wrote:
>
http://codereview.appspot.com/**4929043/<http://codereview.appspot.com/4929043/>
>
Sign in to reply to this message.
chandlerc
Thanks for working on this. I wonder if we need to generalize this whole pattern ...
14 years, 4 months ago (2011年08月24日 23:13:06 UTC) #6
Thanks for working on this. I wonder if we need to generalize this whole pattern
somewhere, as its a lot of work. But it sure seems to pay off. =D
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp
File lib/Sema/SemaDecl.cpp (right):
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp#newcode...
lib/Sema/SemaDecl.cpp:2909: /// hasSimilarParameters - Determine whether the C++
functions Declaration
s/functions/function's/
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp#newcode...
lib/Sema/SemaDecl.cpp:4205: // The rest of the parameters are for calling
ActOnFunctionDeclarator
Ugh. Could we stash these in a parameter object, or somehow factor it so that
they're more clearly managed? That would also help with the confusing naming of
'S' and 'Sc' for example.
Also, this function definitely needs a doxyment.
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp#newcode...
lib/Sema/SemaDecl.cpp:4244: // Back up the value of the by-reference booleans
I have a slight preference to call the function with our own local variables,
and then to set the output parameters if it succeeds... Makes for nice names
like "TrialRedeclaration" and "TrialAddToScope"
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp#newcode...
lib/Sema/SemaDecl.cpp:4284: if (TypoWasCorrected)
Why not just hoist this into the code that sets TypoWasCorrected to true?
Hmm, at this point in this function's complexity, I think we need to split it
into several functions. Specifically I'm thinking the loop below to emit notes
should be a separate function that we can call from the various places where it
makes sense, and then we can hoist these diagnostics up into the branches above,
and switch them to use early exit, reducing indentation.
Does that make sense? Separate patches would be fine with me here, and those
should be fine for post-commit review.
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp#newcode...
lib/Sema/SemaDecl.cpp:4290: S.Diag(NewFD->getLocation(), DiagMsg) << Name <<
NewDC << NewFD->getLocation();
80 columns
Sign in to reply to this message.
Kaelyn
Chandler, I'd like to get any additional comments you have about the function parameters before ...
14 years, 4 months ago (2011年08月25日 00:14:54 UTC) #7
Chandler, I'd like to get any additional comments you have about the function
parameters before sending out a new patch as I suspect any changes there are the
most likely to warrant additional review.
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp
File lib/Sema/SemaDecl.cpp (right):
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp#newcode...
lib/Sema/SemaDecl.cpp:2909: /// hasSimilarParameters - Determine whether the C++
functions Declaration
On 2011年08月24日 23:13:06, chandlerc wrote:
> s/functions/function's/
No, it should be plural not singular-possessive because "functions" is referring
to the two FunctionDecl parameters named Declaration and Definition, which refer
to two C++ functions. hasSimilarParameters does not know or care if Declaration
and Definition are FunctionDecls for the same logical C++ function or for two
unrelated functions.
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp#newcode...
lib/Sema/SemaDecl.cpp:4205: // The rest of the parameters are for calling
ActOnFunctionDeclarator
On 2011年08月24日 23:13:06, chandlerc wrote:
> Ugh. Could we stash these in a parameter object, or somehow factor it so that
> they're more clearly managed? That would also help with the confusing naming
of
> 'S' and 'Sc' for example.
There is a generic parameter object in C++/STL/LLVM/Clang? This was one of the
times I was really wishing I could do the equivalent of the Python "def
foo(arg_list): bar(x, *arg_list)". I didn't want to manually define, pack and
unpack a struct just for a static function that is only called in two places in
another single function.
I also agree that S and Sc are confusing... but ran into a naming collision with
this function needing a Sema argument, but then having to add a Scope argument
to pass on to ActOnFunctionDeclarator. Damned overly short type names that have
the same capitalization convention as variables. ;) I'm open to suggestions for
meaningful and not overly verbose alternate names...
> 
> Also, this function definitely needs a doxyment.
Will do.
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp#newcode...
lib/Sema/SemaDecl.cpp:4244: // Back up the value of the by-reference booleans
On 2011年08月24日 23:13:06, chandlerc wrote:
> I have a slight preference to call the function with our own local variables,
> and then to set the output parameters if it succeeds... Makes for nice names
> like "TrialRedeclaration" and "TrialAddToScope"
I considered both ways, and decided to reset them if necessary on the assumption
that DiagnoseInvalidRedeclaration would more often deal with either a typo *or*
mismatched parameter types or cv-qualifiers than with both a typo and a
mismatch.
Also, since there's a lot of side-effect state changes, I'd rather the
consistency of just clean up all of the affected state when there is an error,
rather than having to clean up some state when there is an error and propagate
the rest of the side effects when there isn't an error.
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp#newcode...
lib/Sema/SemaDecl.cpp:4284: if (TypoWasCorrected)
On 2011年08月24日 23:13:06, chandlerc wrote:
> Why not just hoist this into the code that sets TypoWasCorrected to true?
The first part could be hoisted into the code that sets TypoWasCorrected to
true, but the second part would then need an "if (!TypoWasCorrected)" to guard
it so that it can happen whether typo correction was not performed or was
rejected. I didn't go that route as I found it clearer to keep the choice of
which diagnostic to print together instead of having part of it buried in the
logic above (and the FixItHint kept me from merging the two S.Diag call
variants).
> 
> Hmm, at this point in this function's complexity, I think we need to split it
> into several functions. Specifically I'm thinking the loop below to emit notes
> should be a separate function that we can call from the various places where
it
> makes sense, and then we can hoist these diagnostics up into the branches
above,
> and switch them to use early exit, reducing indentation.
> 
> Does that make sense? Separate patches would be fine with me here, and those
> should be fine for post-commit review.
That does make sense... however, looking at the code with fresher eyes, the
typo-correction-specific diagnostics can be folded into the code above where
TypoWasCorrected is set to true without creating another helper function.
Instead of populating NearMatches, that loop could just emit the diagnostics
instead. I'll upload a new patch with the changes I'm talking about once I have
them done along with the comment for DiagnoseInvalidRedeclaration added and
hopefully the parameter list fugliness cleaned up a bit.
http://codereview.appspot.com/4929043/diff/5001/lib/Sema/SemaDecl.cpp#newcode...
lib/Sema/SemaDecl.cpp:4290: S.Diag(NewFD->getLocation(), DiagMsg) << Name <<
NewDC << NewFD->getLocation();
On 2011年08月24日 23:13:06, chandlerc wrote:
> 80 columns
Damned three additional characters! ;)
Sign in to reply to this message.
Kaelyn
14 years, 4 months ago (2011年08月30日 23:16:34 UTC) #8
Sign in to reply to this message.
Kaelyn
Since trying to refactor Sema::ActOnFunctionDeclarator has proved to be far more time consuming and invasive ...
14 years, 4 months ago (2011年08月30日 23:26:57 UTC) #9
Since trying to refactor Sema::ActOnFunctionDeclarator has proved to be far
more time consuming and invasive (lots of state needed throughout the func
spread among multiple variables with far too many order-dependent calls to
other complex functions that depend heavily on side-effects), I've updated
the current fix for DiganoseInvalidRedeclaration typo correction to pack the
extra args needed to call Sema::ActOnFunctionDeclarator into a struct. And
yes, I suspect the run-on sentence complete with tangents is a symptom of
spending so much time digging around in and trying to untangle
Sema::ActOnFunctionDeclarator.
The updated patch is attached, as rietveld is still too lame to send out an
email with a patch or any kind of description when using its upload.py
script to update an existing issue with a new patchset.
Cheers,
Kaelyn
On Tue, Aug 30, 2011 at 4:16 PM, <rikka@google.com> wrote:
>
http://codereview.appspot.com/**4929043/<http://codereview.appspot.com/4929043/>
>
Sign in to reply to this message.
chandlerc
Ugh. I dunno what the right call is here. This is a kinda horrible hack, ...
14 years, 4 months ago (2011年08月30日 23:29:53 UTC) #10
Ugh. I dunno what the right call is here. This is a kinda horrible hack, if
slightly less horrible than the last iteration... But I don't think anything is
going to fix it short of the refactoring you have a FIXME for... I'd probably
just wait for that refactoring to land, but maybe Doug feels differently.
http://codereview.appspot.com/4929043/diff/13001/lib/Sema/SemaDecl.cpp
File lib/Sema/SemaDecl.cpp (right):
http://codereview.appspot.com/4929043/diff/13001/lib/Sema/SemaDecl.cpp#newcod...
lib/Sema/SemaDecl.cpp:4205: struct AoFDParameterPack {
We need to put this into an anonymous namespace. Also, "ParameterPack" means
something very specific in C++. Maybe: ActOnFDArgs? Yuck. Dunno.
Sign in to reply to this message.
Kaelyn
14 years, 4 months ago (2011年08月31日 00:20:15 UTC) #11
Sign in to reply to this message.
Kaelyn
On 2011年08月30日 23:29:53, chandlerc wrote: > Ugh. I dunno what the right call is here. ...
14 years, 4 months ago (2011年08月31日 00:20:29 UTC) #12
On 2011年08月30日 23:29:53, chandlerc wrote:
> Ugh. I dunno what the right call is here. This is a kinda horrible hack, if
> slightly less horrible than the last iteration... But I don't think anything
is
> going to fix it short of the refactoring you have a FIXME for... I'd probably
> just wait for that refactoring to land, but maybe Doug feels differently.
I agree this is a horrible hack (and right now feeling like it is only
marginally more horrid than the body of ActOnFunctionDeclarator), but I don't
know when the refactoring might even be close to landing... and I'm starting to
suspect the refactoring may not even help enough to eliminate the need to pass a
bunch of otherwise-unused arguments to DiagnoseInvalidRedeclaration so that it
can check a typo correction. Did just discover that it would be possible to
compute 4 of the 9 extra args to ActOnFunctionDeclarator from within
DiagnoseInvalidRedeclaration...
> 
> http://codereview.appspot.com/4929043/diff/13001/lib/Sema/SemaDecl.cpp
> File lib/Sema/SemaDecl.cpp (right):
> 
>
http://codereview.appspot.com/4929043/diff/13001/lib/Sema/SemaDecl.cpp#newcod...
> lib/Sema/SemaDecl.cpp:4205: struct AoFDParameterPack {
> We need to put this into an anonymous namespace. Also, "ParameterPack" means
> something very specific in C++. Maybe: ActOnFDArgs? Yuck. Dunno.
Done and done.
Sign in to reply to this message.
|
This is Rietveld f62528b

AltStyle によって変換されたページ (->オリジナル) /