From 2d833e349029ba73d4a101831371515a25dbda60 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Sat, 2 May 2009 00:36:19 +0000 Subject: [PATCH] Fix bitfield promotions in several more cases. We don't seem to work hard enough at determining whether an expression is a bitfield or not, yet. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70613 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExpr.cpp | 23 ++++++++++++++++++++--- test/Sema/bitfield.c | 5 +++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 3442cc1db9..47b9fbd7bc 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -264,6 +264,14 @@ QualType Sema::UsualArithmeticConversions(Expr *&lhsExpr, Expr *&rhsExpr, if (!lhs->isArithmeticType() || !rhs->isArithmeticType()) return lhs; + // Perform bitfield promotions. + QualType LHSBitfieldPromoteTy = isPromotableBitField(lhsExpr, Context); + if (!LHSBitfieldPromoteTy.isNull()) + lhs = LHSBitfieldPromoteTy; + QualType RHSBitfieldPromoteTy = isPromotableBitField(rhsExpr, Context); + if (!RHSBitfieldPromoteTy.isNull()) + rhs = RHSBitfieldPromoteTy; + QualType destType = UsualArithmeticConversionsType(lhs, rhs); if (!isCompAssign) ImpCastExprToType(lhsExpr, destType); @@ -3475,6 +3483,12 @@ inline QualType Sema::CheckAdditionOperands( // C99 6.5.6 QualType LHSTy = lex->getType(); if (LHSTy->isPromotableIntegerType()) LHSTy = Context.IntTy; + else { + QualType T = isPromotableBitField(lex, Context); + if (!T.isNull()) + LHSTy = T; + } + *CompLHSTy = LHSTy; } return PExp->getType(); @@ -3628,8 +3642,11 @@ QualType Sema::CheckShiftOperands(Expr *&lex, Expr *&rex, SourceLocation Loc, QualType LHSTy; if (lex->getType()->isPromotableIntegerType()) LHSTy = Context.IntTy; - else - LHSTy = lex->getType(); + else { + LHSTy = isPromotableBitField(lex, Context); + if (LHSTy.isNull()) + LHSTy = lex->getType(); + } if (!isCompAssign) ImpCastExprToType(lex, LHSTy); @@ -4067,7 +4084,7 @@ QualType Sema::CheckAssignmentOperands(Expr *LHS, Expr *&RHS, // C99 6.5.16.1p2: In simple assignment, the value of the right operand // is converted to the type of the assignment expression (above). // C++ 5.17p1: the type of the assignment expression is that of its left - // oprdu. + // operand. return LHSType.getUnqualifiedType(); } diff --git a/test/Sema/bitfield.c b/test/Sema/bitfield.c index e81b802789..526a225ff2 100644 --- a/test/Sema/bitfield.c +++ b/test/Sema/bitfield.c @@ -29,3 +29,8 @@ struct a { struct b {unsigned x : 2;} x; __typeof__(x.x+1) y; int y; + +struct {unsigned x : 2;} x2; +// FIXME: __typeof__((x.x+=1)+1) y; +__typeof__(x.x<<1) y; +int y; -- 2.40.0