r209511 - PR19352 - getLocation() points to the wrong position for FriendDecls

Richard Smith richard at metafoo.co.uk
Wed Sep 24 20:34:16 PDT 2014


On Sat, Sep 6, 2014 at 3:26 AM, Abramo Bagnara <abramo.bagnara at bugseng.com>
wrote:

> Ping
>
> Il 02/09/2014 06:57, Nikola Smiljanic ha scritto:
> > Changing getLocStart to getLocEnd would indeed fix the first issue, are
> > you OK with this Richard?
>

That would do the wrong thing for

  friend A<int>;

I think the right thing to do is to work out the location earlier on in the
function: in the ElaboratedTypeSpecifier case, grab the location from the
inner RecordDecl or EnumDecl. In the other case, can we set the location to
FriendLoc? There isn't an identifier being declared in any sense in that
case, so using the location of the 'friend' token seems reasonable to me.


> > As for the second example, this type of declaration appears unsupported
> > (not sure what this exactly means), but I wouldn't be surprised if ast
> > is incomplete because of this. Namely NumTPLists is 0 when FriendDecl is
> > coming from the instantiation. This is from getSourceRange:
> >
> >     else if (TypeSourceInfo *TInfo = getFriendType()) {
> >       SourceLocation StartL = (NumTPLists == 0)
> >         ? getFriendLoc()
> >         : getTPLists()[0]->getTemplateLoc();
> >       return SourceRange(StartL, TInfo->getTypeLoc().getEndLoc())
> >
> > On Sat, Aug 30, 2014 at 4:43 PM, Abramo Bagnara
> > <abramo.bagnara at bugseng.com <mailto:abramo.bagnara at bugseng.com>> wrote:
> >
> >     Il 30/08/2014 03:02, Nikola Smiljanic ha scritto:
> >     >     > This seems wrong to me.
> >     >     >
> >     >     > Did you mean to write getLocEnd() instead? (Under the
> >     assumption that
> >     >     > identifier should comes last in class type)
> >     >
> >     >
> >     > This was done so that 'friend struct A' and 'friend A' (C++11) have
> >     > different location since former is also a forward declaration.
> >     Does that
> >     > make sense or have I misunderstood your question?
> >
> >     AFAIK this is not correct: getLocation() should always return the
> >     location of identifier token.
> >
> >     >
> >     >     It is useful to know that currently for:
> >     >
> >     >     template <class U> class C {
> >     >       template<class T> friend struct A<T>::B;
> >     >     };
> >     >
> >     >
> >     > Not really sure what A is supposed to be here but this code is
> >     > ill-formed: explicit specialization of non-template struct 'A'
> >
> >     This was only the part containing shown location, full code is
> >
> >     template <class T> struct A
> >     {
> >       struct B { };
> >     };
> >
> >     template <class U> class C {
> >       template <class T> friend struct A<T>::B;
> >     };
> >
> >
> >     --
> >     Abramo Bagnara
> >
> >     BUGSENG srl - http://bugseng.com
> >     mailto:abramo.bagnara at bugseng.com <mailto:abramo.bagnara at bugseng.com
> >
> >
> >
>
>
> --
> Abramo Bagnara
>
> BUGSENG srl - http://bugseng.com
> mailto:abramo.bagnara at bugseng.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140924/6e487058/attachment.html>


More information about the cfe-commits mailing list