[cfe-commits] r92041 - in /cfe/trunk: lib/Sema/SemaExprCXX.cpp test/CodeGenCXX/rtti-linkage.cpp

Douglas Gregor dgregor at apple.com
Wed Dec 23 15:25:49 PST 2009


On Dec 23, 2009, at 3:21 PM, Eli Friedman wrote:

> On Wed, Dec 23, 2009 at 12:51 PM, Douglas Gregor <dgregor at apple.com>  
> wrote:
>> Author: dgregor
>> Date: Wed Dec 23 14:51:04 2009
>> New Revision: 92041
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=92041&view=rev
>> Log:
>> Remove cv-qualifiers from the argument to typeid
>>
>> Modified:
>>    cfe/trunk/lib/Sema/SemaExprCXX.cpp
>>    cfe/trunk/test/CodeGenCXX/rtti-linkage.cpp
>>
>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=92041&r1=92040&r2=92041&view=diff
>>
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> = 
>> =====================================================================
>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Wed Dec 23 14:51:04 2009
>> @@ -31,9 +31,14 @@
>>   if (!StdNamespace)
>>     return ExprError(Diag(OpLoc,  
>> diag::err_need_header_before_typeid));
>>
>> -  if (isType)
>> +  if (isType) {
>> +    // C++ [expr.typeid]p4:
>> +    //   The top-level cv-qualifiers of the lvalue expression or  
>> the type-id
>> +    //   that is the operand of typeid are always ignored.
>>     // FIXME: Preserve type source info.
>> -    TyOrExpr = GetTypeFromParser(TyOrExpr).getAsOpaquePtr();
>> +    // FIXME: Preserve the type before we stripped the cv- 
>> qualifiers?
>> +    TyOrExpr =GetTypeFromParser(TyOrExpr).getUnqualifiedType 
>> ().getAsOpaquePtr();
>> +  }
>>
>>   IdentifierInfo *TypeInfoII = &PP.getIdentifierTable().get 
>> ("type_info");
>>   LookupResult R(*this, TypeInfoII, SourceLocation(), LookupTagName);
>> @@ -45,21 +50,35 @@
>>   QualType TypeInfoType = Context.getTypeDeclType 
>> (TypeInfoRecordDecl);
>>
>>   if (!isType) {
>> -    // C++0x [expr.typeid]p3:
>> -    //   When typeid is applied to an expression other than an  
>> lvalue of a
>> -    //   polymorphic class type [...] [the] expression is an  
>> unevaluated
>> -    //   operand.
>> -
>> -    // FIXME: if the type of the expression is a class type, the  
>> class
>> -    // shall be completely defined.
>>     bool isUnevaluatedOperand = true;
>>     Expr *E = static_cast<Expr *>(TyOrExpr);
>> -    if (E && !E->isTypeDependent() && E->isLvalue(Context) ==  
>> Expr::LV_Valid) {
>> +    if (E && !E->isTypeDependent()) {
>>       QualType T = E->getType();
>>       if (const RecordType *RecordT = T->getAs<RecordType>()) {
>>         CXXRecordDecl *RecordD = cast<CXXRecordDecl>(RecordT- 
>> >getDecl());
>> -        if (RecordD->isPolymorphic())
>> +        // C++ [expr.typeid]p3:
>> +        //   When typeid is applied to an expression other than an  
>> lvalue of a
>> +        //   polymorphic class type [...] [the] expression is an  
>> unevaluated
>> +        //   operand. [...]
>> +        if (RecordD->isPolymorphic() && E->isLvalue(Context) ==  
>> Expr::LV_Valid)
>>           isUnevaluatedOperand = false;
>> +        else {
>> +          // C++ [expr.typeid]p3:
>> +          //   [...] If the type of the expression is a class  
>> type, the class
>> +          //   shall be completely-defined.
>> +          // FIXME: implement this!
>> +        }
>> +      }
>> +
>> +      // C++ [expr.typeid]p4:
>> +      //   [...] If the type of the type-id is a reference to a  
>> possibly
>> +      //   cv-qualified type, the result of the typeid expression  
>> refers to a
>> +      //   std::type_info object representing the cv-unqualified  
>> referenced
>> +      //   type.
>> +      if (T.hasQualifiers()) {
>> +        ImpCastExprToType(E, T.getUnqualifiedType(),  
>> CastExpr::CK_NoOp,
>> +                          E->isLvalue(Context));
>> +        TyOrExpr = E;
>>       }
>>     }
>
> Umm, applying getUnqualifiedType to a non-canonical type?

Yes, that works now; I fixed it a few weeks ago after seeing too many  
bugs where it did the wrong thing for non-canonical types. We desugar  
the type as far as we need to to find an unqualified type.

	- Doug



More information about the cfe-commits mailing list