diff options
author | Anders Carlsson <andersca@mac.com> | 2009-03-14 00:33:21 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-03-14 00:33:21 +0000 |
commit | c3082413e4207173b32c118e922d63149df6261f (patch) | |
tree | e0c7a4c925a97649266bcb22dadfb0548a5c5a55 | |
parent | 3eb8dd78a622d257a7fed279714428c3de906f93 (diff) |
Handle dependent types/exprs in static_assert expressions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66997 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/Expr.cpp | 1 | ||||
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 25 | ||||
-rw-r--r-- | test/SemaCXX/static-assert.cpp | 9 |
3 files changed, 24 insertions, 11 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 273b5ed72f..e34412e190 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1044,6 +1044,7 @@ static ICEDiag CheckEvalInICE(const Expr* E, ASTContext &Ctx) { } static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) { + assert(!E->isValueDependent() && "Should not see value dependent exprs!"); if (!E->getType()->isIntegralType()) { return ICEDiag(2, E->getLocStart()); } diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 57a6c62461..37035b98c7 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -2243,20 +2243,23 @@ Sema::DeclTy *Sema::ActOnStaticAssertDeclaration(SourceLocation AssertLoc, StringLiteral *AssertMessage = cast<StringLiteral>((Expr *)assertmessageexpr.get()); - llvm::APSInt Value(32); - if (!AssertExpr->isIntegerConstantExpr(Value, Context)) { - Diag(AssertLoc, diag::err_static_assert_expression_is_not_constant) << - AssertExpr->getSourceRange(); - return 0; - } + if (!AssertExpr->isTypeDependent() && !AssertExpr->isValueDependent()) { + llvm::APSInt Value(32); + if (!AssertExpr->isIntegerConstantExpr(Value, Context)) { + Diag(AssertLoc, diag::err_static_assert_expression_is_not_constant) << + AssertExpr->getSourceRange(); + return 0; + } + if (Value == 0) { + std::string str(AssertMessage->getStrData(), + AssertMessage->getByteLength()); + Diag(AssertLoc, diag::err_static_assert_failed) << str; + } + } + Decl *Decl = StaticAssertDecl::Create(Context, CurContext, AssertLoc, AssertExpr, AssertMessage); - if (Value == 0) { - std::string str(AssertMessage->getStrData(), - AssertMessage->getByteLength()); - Diag(AssertLoc, diag::err_static_assert_failed) << str; - } CurContext->addDecl(Decl); return Decl; diff --git a/test/SemaCXX/static-assert.cpp b/test/SemaCXX/static-assert.cpp index a2b0b52d5d..94ffff86cd 100644 --- a/test/SemaCXX/static-assert.cpp +++ b/test/SemaCXX/static-assert.cpp @@ -13,3 +13,12 @@ void g() { class C { static_assert(false, "false is false"); // expected-error {{static_assert failed "false is false"}} }; + +template<int N> struct T { + static_assert(N == 2, "N is not 2!"); +}; + +template<typename T> struct S { + static_assert(sizeof(T) > sizeof(char), "Type not big enough!"); +}; + |