summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-03-14 00:25:26 +0000
committerAnders Carlsson <andersca@mac.com>2009-03-14 00:25:26 +0000
commit5bbe1d7ba74ed004b5f297185bf8f08e313b0c58 (patch)
tree93511ab04b94614acb6d436a8c1766b666566ebd /clang/lib/Sema/SemaDeclCXX.cpp
parentc86715631cf936da5d94be15a07d14f0153f5b4c (diff)
downloadbcm5719-llvm-5bbe1d7ba74ed004b5f297185bf8f08e313b0c58.tar.gz
bcm5719-llvm-5bbe1d7ba74ed004b5f297185bf8f08e313b0c58.zip
More static_assert work. Check that the assert expr is valid and show an error if it's false. Create the declaration and add it to the current context.
llvm-svn: 66995
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index f5d8f6b5e12..57a6c624616 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -2234,3 +2234,30 @@ Sema::DeclTy *Sema::ActOnExceptionDeclarator(Scope *S, Declarator &D)
ProcessDeclAttributes(ExDecl, D);
return ExDecl;
}
+
+Sema::DeclTy *Sema::ActOnStaticAssertDeclaration(SourceLocation AssertLoc,
+ ExprArg assertexpr,
+ ExprArg assertmessageexpr,
+ SourceLocation RParenLoc) {
+ Expr *AssertExpr = (Expr *)assertexpr.get();
+ 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;
+ }
+
+ 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;
+}
OpenPOWER on IntegriCloud