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

Abramo Bagnara abramo.bagnara at bugseng.com
Sat Sep 6 03:26:46 PDT 2014


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?
> 
> 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



More information about the cfe-commits mailing list