On Oct 28, 2008, at 8:25 AM, Doug Gregor wrote:
>>> +++ cfe/trunk/lib/AST/Expr.cpp Mon Oct 27 19:22:11 2008
>>> @@ -393,6 +393,20 @@
>>>   break;
>>> case ParenExprClass: // C99 6.5.1p5
>>>   return cast<ParenExpr>(this)->getSubExpr()->isLvalue(Ctx);
>>> +  case CallExprClass: {
>>> +    // C++ [expr.call]p10:
>>> +    //   A function call is an lvalue if and only if the result  
>>> type
>>> +    //   is a reference.
>>> +    QualType CalleeType
>>> +      = dyn_cast<CallExpr>(this)->getCallee()->IgnoreParens()- 
>>> >getType();
>>> +    if (const PointerType *FnTypePtr = CalleeType- 
>>> >getAsPointerType())
>>
>> Won't this crash if dyn_cast returns null?
>
> Oops, it should just be cast<CallExpr>, since we know the type  
> statically.

Oh right.

>> It would also be more idiomatic
>> and claean to make 'CalleeType' be a Type* instead of a QualType,  
>> as there
>> are no qualifiers in the result of the dyn_cast.
>
> ?? The thing we're getting back is a QualType.

cast<T> returns a "T*" or "const T*".  It is just being implicitly  
converted to QualType here with no qualifiers.  The cast argument is  
converted from QualType to Type by  
simplify_type<const ::clang::QualType> at around Type.h:212.

-Chris
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to