[cfe-dev] Difference between getResultType adn getCallResultType

Alp Toker alp at nuanti.com
Fri Jan 24 17:48:24 PST 2014

On 25/01/2014 01:24, Richard Smith wrote:
> On Fri Jan 24 2014 at 9:20:44 AM, Jordan Rose <jordan_rose at apple.com 
> <mailto:jordan_rose at apple.com>> wrote:
>     On Jan 24, 2014, at 2:51 , Pedro Delgado Perez
>     <pedro.delgadoperez at mail.uca.es
>     <mailto:pedro.delgadoperez at mail.uca.es>> wrote:
>>     Hi,
>>     My question is simple. Could anyone explain me what's the
>>     difference between the methods
>>     getResultType and getCallResultType in FunctionDecl?
>>     This is the implementation in FunctionType:
>>     02783  <http://clang.llvm.org/doxygen/classclang_1_1FunctionType.html#aafa453cd7e81a7c3d6c61f261e68afe8>    QualType  <http://clang.llvm.org/doxygen/classclang_1_1QualType.html>  getResultType  <http://clang.llvm.org/doxygen/classclang_1_1FunctionType.html#aafa453cd7e81a7c3d6c61f261e68afe8>()  const{return  ResultType; }
>>     ...
>>     02799  <http://clang.llvm.org/doxygen/classclang_1_1FunctionType.html#a5f8df0258bcf7281e7055ea01dbd8f85>    QualType  <http://clang.llvm.org/doxygen/classclang_1_1QualType.html>  getCallResultType  <http://clang.llvm.org/doxygen/classclang_1_1FunctionType.html#a5f8df0258bcf7281e7055ea01dbd8f85>(ASTContext  <http://clang.llvm.org/doxygen/classclang_1_1ASTContext.html>  &Context  <http://clang.llvm.org/doxygen/ASTMatchFinder_8cpp.html#a779280869b9fac47a9bc391e7709171f>)  const{2800return  getResultType().getNonLValueExprType  <http://clang.llvm.org/doxygen/classclang_1_1QualType.html#a89e3ea65c009b7a0ea76edc56076107c>(Context);2801   }
>>     And this is the definition ofgetNonLValueExprType
>>     <http://clang.llvm.org/doxygen/classclang_1_1QualType.html#a89e3ea65c009b7a0ea76edc56076107c>:
>>     Determine the type of a (typically non-lvalue) expression with
>>     the specified result type.
>>     This routine should be used for expressions for which the return
>>     type is explicitly specified (e.g., in a cast or call) and isn't
>>     necessarily an lvalue. It removes a top-level reference (since
>>     there are no expressions of reference type) and deletes top-level
>>     cvr-qualifiers from non-class types (in C++) or all types (in C).
>>     But I am not able to understand this very well. Could anyone give
>>     me an example of the difference? Up to now, I have been using
>>     getResultType, but now I have found getCallResultType and I'm not
>>     sure what should I use.
>     I'm not 100% sure about this, but my understanding is:
>     You can declare your function to return "const int", but the
>     caller is just going to get an int. Similarly, if you declare your
>     function to return "int &", the calling expression has type "int"
>     but is marked as an lvalue.
>     On the other hand, if you return "const int *", dropping the const
>     would be incorrect. (And the same is actually true for "const int &".)
>     Basically, if you want to know the type the function says it's
>     returning, use getResultType(). If you want to know the type that
>     the CallExpr will have, use getCallResultType().
> We should rename 'getResultType' to 'getReturnType' to clarify this 
> (and to generally follow the standard terminology). This has been on 
> my TODO list for a long time, but there's always been something more 
> pressing to do...

I'll take a look into this shortly, it's very much in line with the 
other terminology fixes we've been working on lately. Will deprecate and 
keep the old version around for external modules.

Richard, do you see any other terminology fixes we could get done while 
I have the refactoring setup primed?


> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

the browser experts

More information about the cfe-dev mailing list