Author: majnemer Date: Wed Jul 30 23:52:13 2014 New Revision: 214386 URL: http://llvm.org/viewvc/llvm-project?rev=214386&view=rev Log: Sema: Disallow taking the address of a bitfield coming from preincrement
Clang forgot that '++s.m' was a bitfield l-value and permit it's address to be taken; this would crash at CodeGen-time. Instead, propagate the object-kind when we see the prefix increment/decrement. This fixes PR20496. Differential Revision: http://reviews.llvm.org/D4733 Modified: cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/CXX/drs/dr3xx.cpp Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=214386&r1=214385&r2=214386&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Jul 30 23:52:13 2014 @@ -8764,6 +8764,7 @@ static QualType CheckCommaOperands(Sema /// doesn't need to call UsualUnaryConversions or UsualArithmeticConversions. static QualType CheckIncrementDecrementOperand(Sema &S, Expr *Op, ExprValueKind &VK, + ExprObjectKind &OK, SourceLocation OpLoc, bool IsInc, bool IsPrefix) { if (Op->isTypeDependent()) @@ -8809,7 +8810,7 @@ static QualType CheckIncrementDecrementO } else if (ResType->isPlaceholderType()) { ExprResult PR = S.CheckPlaceholderExpr(Op); if (PR.isInvalid()) return QualType(); - return CheckIncrementDecrementOperand(S, PR.get(), VK, OpLoc, + return CheckIncrementDecrementOperand(S, PR.get(), VK, OK, OpLoc, IsInc, IsPrefix); } else if (S.getLangOpts().AltiVec && ResType->isVectorType()) { // OK! ( C/C++ Language Extensions for CBEA(Version 2.6) 10.3 ) @@ -8830,6 +8831,7 @@ static QualType CheckIncrementDecrementO // operand. if (IsPrefix && S.getLangOpts().CPlusPlus) { VK = VK_LValue; + OK = Op->getObjectKind(); return ResType; } else { VK = VK_RValue; @@ -9818,7 +9820,8 @@ ExprResult Sema::CreateBuiltinUnaryOp(So case UO_PreDec: case UO_PostInc: case UO_PostDec: - resultType = CheckIncrementDecrementOperand(*this, Input.get(), VK, OpLoc, + resultType = CheckIncrementDecrementOperand(*this, Input.get(), VK, OK, + OpLoc, Opc == UO_PreInc || Opc == UO_PostInc, Opc == UO_PreInc || Modified: cfe/trunk/test/CXX/drs/dr3xx.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr3xx.cpp?rev=214386&r1=214385&r2=214386&view=diff ============================================================================== --- cfe/trunk/test/CXX/drs/dr3xx.cpp (original) +++ cfe/trunk/test/CXX/drs/dr3xx.cpp Wed Jul 30 23:52:13 2014 @@ -322,6 +322,7 @@ namespace dr324 { // dr324: yes int *f = &(true ? s.n : s.n); // expected-error {{address of bit-field}} int &g = (void(), s.n); // expected-error {{non-const reference cannot bind to bit-field}} int *h = &(void(), s.n); // expected-error {{address of bit-field}} + int *i = &++s.n; // expected-error {{address of bit-field}} } namespace dr326 { // dr326: yes _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
