Broken name range for function template specialization (and a related question)

Abramo Bagnara abramo.bagnara at bugseng.com
Fri Jul 18 00:17:43 PDT 2014


Ping.

Il 15/07/2014 12:58, Abramo Bagnara ha scritto:
> 
> Tracking down a failure in one of our applications I've obtained the
> following testcase:
> 
> template<typename T>
> int operator+(T&);
> 
> template<>
> int operator+(class c&);
> 
> As far as I can see clang first produce an instantiation for function
> template, then produces the explicit specialization as a redecl of the
> former one.
> 
> The first decl is not attached to visitable AST, but only available as
> redeclaration of explicit specialization (as its canonical decl).
> 
> In SemaTemplate.cpp near line 6706 we have:
> 
>   // Note: do not overwrite location info if previous template
>   // specialization kind was explicit.
>   TemplateSpecializationKind TSK =
> SpecInfo->getTemplateSpecializationKind();
>   if (TSK == TSK_Undeclared || TSK == TSK_ImplicitInstantiation) {
>     Specialization->setLocation(FD->getLocation());
>     // C++11 [dcl.constexpr]p1: An explicit specialization of a constexpr
>     // function can differ from the template declaration with respect to
>     // the constexpr specifier.
>     Specialization->setConstexpr(FD->isConstexpr());
>   }
> 
> The problem is that setLocation copy only a part of name info locations,
> so the canonical decl ends up having a name range that starts from token
> `operator' of specialization and ends at token `+' of template (i.e. a
> negative/broken range).
> 
> Likely this is easily fixable copying both edges of range (I'm guessing,
> please confirm that) but I'd like also to understand why we need to have
> *two* declarations (with one of them not reachable with ordinary visits).
> 


-- 
Abramo Bagnara

BUGSENG srl - http://bugseng.com
mailto:abramo.bagnara at bugseng.com



More information about the cfe-commits mailing list