[cfe-dev] Make TypeLoc::getAs look through AttributedTypeLoc?

Stephan Bergmann via cfe-dev cfe-dev at lists.llvm.org
Tue Jan 24 09:50:41 PST 2017


Trying to use the (recently added to trunk) 
FunctionDecl::getExceptionSpecSourceRange, it failed on some function 
decl using MSVC __cdecl, as such a decl's 
getTypeSourceInfo()->getTypeLoc() is an AttributeTypeLoc wrapped around 
a FunctionTypedLoc.

For now, I patched that locally with

> diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp
> index 81f0878..631453b 100644
> --- a/lib/AST/Decl.cpp
> +++ b/lib/AST/Decl.cpp
> @@ -2994,8 +2994,10 @@ SourceRange FunctionDecl::getExceptionSpecSourceRange() const {
>    const TypeSourceInfo *TSI = getTypeSourceInfo();
>    if (!TSI)
>      return SourceRange();
> -  FunctionTypeLoc FTL =
> -    TSI->getTypeLoc().IgnoreParens().getAs<FunctionTypeLoc>();
> +  auto TL = TSI->getTypeLoc().IgnoreParens();
> +  if (auto ATL = TL.getAs<AttributedTypeLoc>())
> +    TL = ATL.getModifiedLoc();
> +  FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>();
>    if (!FTL)
>      return SourceRange();
>

but wonder what the right fix would be---change call sites of 
TypeLoc::getAs as done in the patch, or change TypeLoc::getAs itself?  I 
see that there's probably the same issue with the directly preceeding 
definition of FunctionDecl::getreturnTypeSourceRange in Decl.cpp, for 
example.



More information about the cfe-dev mailing list