diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-06-10 23:34:28 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-06-10 23:34:28 +0000 |
commit | 703ae55cf56de8d6379a7b84488970dc29826030 (patch) | |
tree | 7584df3149aa900cd9cfce4fb85fdb6d51ca2359 /lib/Sema/SemaExpr.cpp | |
parent | 4ed0870592c05a5c6f80268bdaf62a081c47477f (diff) | |
download | clang-703ae55cf56de8d6379a7b84488970dc29826030.tar.gz clang-703ae55cf56de8d6379a7b84488970dc29826030.tar.bz2 clang-703ae55cf56de8d6379a7b84488970dc29826030.tar.xz |
Related to PR19992: when the GNU alignof-expression extension is applied to an
expression of array-of-unknown-bound type, don't try to complete the array
bound, and return the alignment of the element type rather than 1.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@210608 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExpr.cpp')
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index d2ba82bc16..041a9eb9d4 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -3341,10 +3341,21 @@ bool Sema::CheckUnaryExprOrTypeTraitOperand(Expr *E, E->getSourceRange(), ExprKind)) return false; - if (RequireCompleteExprType(E, - diag::err_sizeof_alignof_incomplete_type, - ExprKind, E->getSourceRange())) - return true; + // 'alignof' applied to an expression only requires the base element type of + // the expression to be complete. 'sizeof' requires the expression's type to + // be complete (and will attempt to complete it if it's an array of unknown + // bound). + if (ExprKind == UETT_AlignOf) { + if (RequireCompleteType(E->getExprLoc(), + Context.getBaseElementType(E->getType()), + diag::err_sizeof_alignof_incomplete_type, ExprKind, + E->getSourceRange())) + return true; + } else { + if (RequireCompleteExprType(E, diag::err_sizeof_alignof_incomplete_type, + ExprKind, E->getSourceRange())) + return true; + } // Completing the expression's type may have changed it. ExprTy = E->getType(); |