diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-03-14 00:25:26 +0000 | 
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-03-14 00:25:26 +0000 | 
| commit | 5bbe1d7ba74ed004b5f297185bf8f08e313b0c58 (patch) | |
| tree | 93511ab04b94614acb6d436a8c1766b666566ebd /clang/lib/Sema/SemaDeclCXX.cpp | |
| parent | c86715631cf936da5d94be15a07d14f0153f5b4c (diff) | |
| download | bcm5719-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.cpp | 27 | 
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; +} | 

