[cfe-commits] r138994 - /cfe/trunk/lib/Sema/SemaExpr.cpp

Chandler Carruth chandlerc at google.com
Thu Sep 1 22:46:42 PDT 2011


On Thu, Sep 1, 2011 at 7:55 PM, Richard Trieu <rtrieu at google.com> wrote:

> +/// \brief Diagnose bad pointer comparisons.
> +static void diagnoseDistinctPointerComparison(Sema &S, SourceLocation Loc,
> +                                              ExprResult &lex, ExprResult
> &rex,
>

I would prefer 'LHS' and 'RHS' over 'lex' and 'rex'. The latter aren't very
consistent with the style rules, and I find 'lex' particularly confusing in
a compiler. =]

Also, "IsError" would be more conforming with the new style rules.


> +                                              bool isError) {
> +  S.Diag(Loc, isError ?
> diag::err_typecheck_comparison_of_distinct_pointers
> +                      :
> diag::ext_typecheck_comparison_of_distinct_pointers)
> +    << lex.get()->getType() << rex.get()->getType()
> +    << lex.get()->getSourceRange() << rex.get()->getSourceRange();
> +}
> +
> +/// \brief Returns false if the pointers are converted to a composite
> type,
> +/// true otherwise.
> +static bool convertPointersToCompositeType(Sema &S, SourceLocation Loc,
> +                                               ExprResult &lex,
> +                                               ExprResult &rex) {
> +  // C++ [expr.rel]p2:
> +  //   [...] Pointer conversions (4.10) and qualification
> +  //   conversions (4.4) are performed on pointer operands (or on
> +  //   a pointer operand and a null pointer constant) to bring
> +  //   them to their composite pointer type. [...]
> +  //
> +  // C++ [expr.eq]p1 uses the same notion for (in)equality
> +  // comparisons of pointers.
> +
> +  // C++ [expr.eq]p2:
> +  //   In addition, pointers to members can be compared, or a pointer to
> +  //   member and a null pointer constant. Pointer to member conversions
> +  //   (4.11) and qualification conversions (4.4) are performed to bring
> +  //   them to a common type. If one operand is a null pointer constant,
> +  //   the common type is the type of the other operand. Otherwise, the
> +  //   common type is a pointer to member type similar (4.4) to the type
> +  //   of one of the operands, with a cv-qualification signature (4.4)
> +  //   that is the union of the cv-qualification signatures of the operand
> +  //   types.
> +
> +  QualType lType = lex.get()->getType();
> +  QualType rType = rex.get()->getType();
> +  assert((lType->isPointerType() && rType->isPointerType()) ||
> +         (lType->isMemberPointerType() && rType->isMemberPointerType()));
> +
> +  bool NonStandardCompositeType = false;
> +  QualType T = S.FindCompositePointerType(Loc, lex, rex,
> +                           S.isSFINAEContext() ? 0 :
> &NonStandardCompositeType);
> +  if (T.isNull()) {
> +    diagnoseDistinctPointerComparison(S, Loc, lex, rex, /*isError*/true);
> +    return true;
> +  }
> +
> +  if (NonStandardCompositeType)
> +    S.Diag(Loc,
> diag::ext_typecheck_comparison_of_distinct_pointers_nonstandard)
> +      << lType << rType << T << lex.get()->getSourceRange()
> +      << rex.get()->getSourceRange();
> +
> +  lex = S.ImpCastExprToType(lex.take(), T, CK_BitCast);
> +  rex = S.ImpCastExprToType(rex.take(), T, CK_BitCast);
> +  return false;
> +}
> +
> +static void diagnoseFunctionPointerToVoidComparison(Sema &S,
> SourceLocation Loc,
> +                                                    ExprResult &lex,
> +                                                    ExprResult &rex,
> +                                                    bool isError) {
> +  S.Diag(Loc,isError ? diag::err_typecheck_comparison_of_fptr_to_void
> +                     : diag::ext_typecheck_comparison_of_fptr_to_void)
> +    << lex.get()->getType() << rex.get()->getType()
> +    << lex.get()->getSourceRange() << rex.get()->getSourceRange();
> +}
> +
>  // C99 6.5.8, C++ [expr.rel]
>  QualType Sema::CheckCompareOperands(ExprResult &lex, ExprResult &rex,
>                                     SourceLocation Loc, unsigned OpaqueOpc,
> @@ -6348,12 +6416,8 @@
>         // conformance with the C++ standard.
>         if ((LCanPointeeTy->isFunctionType() ||
> RCanPointeeTy->isFunctionType())
>             && !LHSIsNull && !RHSIsNull) {
> -          Diag(Loc,
> -               isSFINAEContext()?
> -                   diag::err_typecheck_comparison_of_fptr_to_void
> -                 : diag::ext_typecheck_comparison_of_fptr_to_void)
> -            << lType << rType << lex.get()->getSourceRange()
> -            << rex.get()->getSourceRange();
> +          diagnoseFunctionPointerToVoidComparison(
> +              *this, Loc, lex, rex, /*isError*/ isSFINAEContext());
>
>           if (isSFINAEContext())
>             return QualType();
> @@ -6363,32 +6427,10 @@
>         }
>       }
>
> -      // C++ [expr.rel]p2:
> -      //   [...] Pointer conversions (4.10) and qualification
> -      //   conversions (4.4) are performed on pointer operands (or on
> -      //   a pointer operand and a null pointer constant) to bring
> -      //   them to their composite pointer type. [...]
> -      //
> -      // C++ [expr.eq]p1 uses the same notion for (in)equality
> -      // comparisons of pointers.
> -      bool NonStandardCompositeType = false;
> -      QualType T = FindCompositePointerType(Loc, lex, rex,
> -                              isSFINAEContext()? 0 :
> &NonStandardCompositeType);
> -      if (T.isNull()) {
> -        Diag(Loc, diag::err_typecheck_comparison_of_distinct_pointers)
> -          << lType << rType << lex.get()->getSourceRange()
> -          << rex.get()->getSourceRange();
> +      if (convertPointersToCompositeType(*this, Loc, lex, rex))
>         return QualType();
> -      } else if (NonStandardCompositeType) {
> -        Diag(Loc,
> -
> diag::ext_typecheck_comparison_of_distinct_pointers_nonstandard)
> -          << lType << rType << T
> -          << lex.get()->getSourceRange() << rex.get()->getSourceRange();
> -      }
> -
> -      lex = ImpCastExprToType(lex.take(), T, CK_BitCast);
> -      rex = ImpCastExprToType(rex.take(), T, CK_BitCast);
> -      return ResultTy;
> +      else
> +        return ResultTy;
>     }
>     // C99 6.5.9p2 and C99 6.5.8p2
>     if (Context.typesAreCompatible(LCanPointeeTy.getUnqualifiedType(),
> @@ -6403,16 +6445,12 @@
>                (LCanPointeeTy->isVoidType() ||
> RCanPointeeTy->isVoidType())) {
>       // Valid unless comparison between non-null pointer and function
> pointer
>       if ((LCanPointeeTy->isFunctionType() ||
> RCanPointeeTy->isFunctionType())
> -          && !LHSIsNull && !RHSIsNull) {
> -        Diag(Loc, diag::ext_typecheck_comparison_of_fptr_to_void)
> -          << lType << rType << lex.get()->getSourceRange()
> -          << rex.get()->getSourceRange();
> -      }
> +          && !LHSIsNull && !RHSIsNull)
> +        diagnoseFunctionPointerToVoidComparison(*this, Loc, lex, rex,
> +                                                /*isError*/false);
>     } else {
>       // Invalid
> -      Diag(Loc, diag::ext_typecheck_comparison_of_distinct_pointers)
> -        << lType << rType << lex.get()->getSourceRange()
> -        << rex.get()->getSourceRange();
> +      diagnoseDistinctPointerComparison(*this, Loc, lex, rex,
> /*isError*/false);
>     }
>     if (LCanPointeeTy != RCanPointeeTy) {
>       if (LHSIsNull && !RHSIsNull)
> @@ -6454,34 +6492,10 @@
>     // Comparison of member pointers.
>     if (!isRelational &&
>         lType->isMemberPointerType() && rType->isMemberPointerType()) {
> -      // C++ [expr.eq]p2:
> -      //   In addition, pointers to members can be compared, or a pointer
> to
> -      //   member and a null pointer constant. Pointer to member
> conversions
> -      //   (4.11) and qualification conversions (4.4) are performed to
> bring
> -      //   them to a common type. If one operand is a null pointer
> constant,
> -      //   the common type is the type of the other operand. Otherwise,
> the
> -      //   common type is a pointer to member type similar (4.4) to the
> type
> -      //   of one of the operands, with a cv-qualification signature (4.4)
> -      //   that is the union of the cv-qualification signatures of the
> operand
> -      //   types.
> -      bool NonStandardCompositeType = false;
> -      QualType T = FindCompositePointerType(Loc, lex, rex,
> -                              isSFINAEContext()? 0 :
> &NonStandardCompositeType);
> -      if (T.isNull()) {
> -        Diag(Loc, diag::err_typecheck_comparison_of_distinct_pointers)
> -          << lType << rType << lex.get()->getSourceRange()
> -          << rex.get()->getSourceRange();
> +      if (convertPointersToCompositeType(*this, Loc, lex, rex))
>         return QualType();
> -      } else if (NonStandardCompositeType) {
> -        Diag(Loc,
> -
> diag::ext_typecheck_comparison_of_distinct_pointers_nonstandard)
> -          << lType << rType << T
> -          << lex.get()->getSourceRange() << rex.get()->getSourceRange();
> -      }
> -
> -      lex = ImpCastExprToType(lex.take(), T, CK_BitCast);
> -      rex = ImpCastExprToType(rex.take(), T, CK_BitCast);
> -      return ResultTy;
> +      else
> +        return ResultTy;
>     }
>
>     // Handle scoped enumeration types specifically, since they don't
> promote
> @@ -6537,9 +6551,8 @@
>
>       if (!LPtrToVoid && !RPtrToVoid &&
>           !Context.typesAreCompatible(lType, rType)) {
> -        Diag(Loc, diag::ext_typecheck_comparison_of_distinct_pointers)
> -          << lType << rType << lex.get()->getSourceRange()
> -          << rex.get()->getSourceRange();
> +        diagnoseDistinctPointerComparison(*this, Loc, lex, rex,
> +                                          /*isError*/false);
>       }
>       if (LHSIsNull && !RHSIsNull)
>         lex = ImpCastExprToType(lex.take(), rType, CK_BitCast);
> @@ -6549,9 +6562,8 @@
>     }
>     if (lType->isObjCObjectPointerType() &&
> rType->isObjCObjectPointerType()) {
>       if (!Context.areComparableObjCPointerTypes(lType, rType))
> -        Diag(Loc, diag::ext_typecheck_comparison_of_distinct_pointers)
> -          << lType << rType << lex.get()->getSourceRange()
> -          << rex.get()->getSourceRange();
> +        diagnoseDistinctPointerComparison(*this, Loc, lex, rex,
> +                                          /*isError*/false);
>       if (LHSIsNull && !RHSIsNull)
>         lex = ImpCastExprToType(lex.take(), rType, CK_BitCast);
>       else
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110901/1989de4f/attachment.html>


More information about the cfe-commits mailing list