diff options
author | Chris Lattner <sabre@nondot.org> | 2009-01-24 21:29:22 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-01-24 21:29:22 +0000 |
commit | 5eca6ada3a0c70d3d844c11e48fab3856baa1d88 (patch) | |
tree | 272f65b23b58aafb4d18ffa49d61437eb59e8497 /clang/lib | |
parent | 4723fb70a97f97ad0341c110add829687052c86f (diff) | |
download | bcm5719-llvm-5eca6ada3a0c70d3d844c11e48fab3856baa1d88.tar.gz bcm5719-llvm-5eca6ada3a0c70d3d844c11e48fab3856baa1d88.zip |
Implement C99 6.5.3.4p1, rejecting sizeof(bitfield)
llvm-svn: 62936
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 56ad4b5f261..d4babb4baa4 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -1046,7 +1046,7 @@ bool Sema::CheckAlignOfExpr(Expr *E, SourceLocation OpLoc, if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) { if (FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl())) { if (FD->isBitField()) { - Diag(OpLoc, diag::err_alignof_bitfield) << ExprRange; + Diag(OpLoc, diag::err_sizeof_alignof_bitfield) << 1 << ExprRange; return true; } // Other fields are ok. @@ -1082,10 +1082,14 @@ Sema::ActOnSizeOfAlignOfExpr(SourceLocation OpLoc, bool isSizeof, bool isType, // Verify that the operand is valid. bool isInvalid; - if (isSizeof) - isInvalid = CheckSizeOfAlignOfOperand(ArgTy, OpLoc, Range, true); - else + if (!isSizeof) { isInvalid = CheckAlignOfExpr(ArgEx, OpLoc, Range); + } else if (ArgEx->isBitField()) { // C99 6.5.3.4p1. + Diag(OpLoc, diag::err_sizeof_alignof_bitfield) << 0; + isInvalid = true; + } else { + isInvalid = CheckSizeOfAlignOfOperand(ArgTy, OpLoc, Range, true); + } if (isInvalid) { DeleteExpr(ArgEx); |