[cfe-commits] r58306 - in /cfe/trunk: include/clang/AST/Expr.h include/clang/AST/ExprCXX.h include/clang/AST/StmtNodes.def include/clang/Analysis/PathSensitive/GRExprEngine.h lib/AST/Expr.cpp lib/Analysis/GRExprEngine.cpp lib/Sema/SemaDecl.cpp li

Doug Gregor doug.gregor at gmail.com
Tue Oct 28 08:25:39 PDT 2008


On Tue, Oct 28, 2008 at 1:09 AM, Chris Lattner <clattner at apple.com> wrote:
> On Oct 27, 2008, at 5:22 PM, Douglas Gregor wrote:
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=58306&view=rev
>> Log:
>> Improve our handling of (C++) references within Clang. Specifically:
>>  - Do not allow expressions to ever have reference type
>>  - Extend Expr::isLvalue to handle more cases where having written a
>>   reference into the source implies that the expression is an lvalue
>>   (e.g., function calls, C++ casts).
>
> Nice assert,
>
>> +++ 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.

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

  - Doug



More information about the cfe-commits mailing list