Improper implicit pointer cast in AST
Abramo Bagnara
abramo.bagnara at bugseng.com
Sun Sep 7 04:05:40 PDT 2014
Il 07/09/2014 05:25, Richard Smith ha scritto:
> On Sat, Sep 6, 2014 at 3:27 AM, Abramo Bagnara
> <abramo.bagnara at bugseng.com <mailto:abramo.bagnara at bugseng.com>> wrote:
>
> Ping
>
> Il 04/09/2014 15:13, Abramo Bagnara ha scritto:
> >
> > For the following source
> >
> > void f() {
> > char *p;
> > const char *cp;
> > p == cp;
> > p != cp;
> > p < cp;
> > p <= cp;
> > p > cp;
> > p >= cp;
> > p - cp;
> > }
> >
> > clang (unexpectedly for me) emits an implicit cast from const char
> * to
> > char * (i.e. it remove a qualifier) for all the relational and
> equality
> > operator, but it (expectedly) does not emit one for the subtraction.
> >
> > AFAIK the C standard does not require any conversion for
> relational and
> > equality operator (just like for subtraction).
> >
> > Do we have a reason to add the implicit casts or it is a bug?
>
>
> It seems like a minor convenience to have an AST invariant that both
> operands are of the same type here, but I expect we could remove these
> implicit casts without any significant repercussions; I'd be mildly in
> favor of doing that since it improves AST fidelity.
I've attached a patch doing that.
Ok to commit?
--
Abramo Bagnara
BUGSENG srl - http://bugseng.com
mailto:abramo.bagnara at bugseng.com
-------------- next part --------------
Index: lib/Sema/SemaChecking.cpp
===================================================================
--- lib/Sema/SemaChecking.cpp (revisione 217331)
+++ lib/Sema/SemaChecking.cpp (copia locale)
@@ -5688,7 +5688,14 @@
static void AnalyzeComparison(Sema &S, BinaryOperator *E) {
// The type the comparison is being performed in.
QualType T = E->getLHS()->getType();
- assert(S.Context.hasSameUnqualifiedType(T, E->getRHS()->getType())
+ assert((S.Context.hasSameUnqualifiedType(T, E->getRHS()->getType()) ||
+ (!S.getLangOpts().CPlusPlus &&
+ T->isPointerType() &&
+ E->getRHS()->getType()->isPointerType() &&
+ !E->getLHS()->isNullPointerConstant(S.Context,
+ Expr::NPC_ValueDependentIsNull) &&
+ !E->getRHS()->isNullPointerConstant(S.Context,
+ Expr::NPC_ValueDependentIsNull)))
&& "comparison with mismatched types");
if (E->isValueDependent())
return AnalyzeImpConvsInComparison(S, E);
Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp (revisione 217331)
+++ lib/Sema/SemaExpr.cpp (copia locale)
@@ -8045,9 +8045,11 @@
unsigned AddrSpaceR = RCanPointeeTy.getAddressSpace();
CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion
: CK_BitCast;
- if (LHSIsNull && !RHSIsNull)
- LHS = ImpCastExprToType(LHS.get(), RHSType, Kind);
- else
+ if (LHSIsNull) {
+ if (!RHSIsNull)
+ LHS = ImpCastExprToType(LHS.get(), RHSType, Kind);
+ }
+ else if (RHSIsNull)
RHS = ImpCastExprToType(RHS.get(), LHSType, Kind);
}
return ResultTy;
More information about the cfe-commits
mailing list