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

Eli Friedman eli.friedman at gmail.com
Wed Dec 23 15:21:29 PST 2009


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?

-Eli




More information about the cfe-commits mailing list