diff options
Diffstat (limited to 'lib/Sema')
-rw-r--r-- | lib/Sema/Sema.h | 3 | ||||
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 6 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateInstantiate.cpp | 19 |
3 files changed, 23 insertions, 5 deletions
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index a357ae7621..29d0796dcb 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -1562,8 +1562,7 @@ public: virtual DeclTy *ActOnStaticAssertDeclaration(SourceLocation AssertLoc, ExprArg AssertExpr, - ExprArg AssertMessageExpr, - SourceLocation RParenLoc); + ExprArg AssertMessageExpr); bool CheckConstructorDeclarator(Declarator &D, QualType &R, FunctionDecl::StorageClass& SC); diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 177eee2a53..fa84c7d2de 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -2238,8 +2238,7 @@ Sema::DeclTy *Sema::ActOnExceptionDeclarator(Scope *S, Declarator &D) Sema::DeclTy *Sema::ActOnStaticAssertDeclaration(SourceLocation AssertLoc, ExprArg assertexpr, - ExprArg assertmessageexpr, - SourceLocation RParenLoc) { + ExprArg assertmessageexpr) { Expr *AssertExpr = (Expr *)assertexpr.get(); StringLiteral *AssertMessage = cast<StringLiteral>((Expr *)assertmessageexpr.get()); @@ -2255,7 +2254,8 @@ Sema::DeclTy *Sema::ActOnStaticAssertDeclaration(SourceLocation AssertLoc, if (Value == 0) { std::string str(AssertMessage->getStrData(), AssertMessage->getByteLength()); - Diag(AssertLoc, diag::err_static_assert_failed) << str; + Diag(AssertLoc, diag::err_static_assert_failed) + << str << AssertExpr->getSourceRange(); } } diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 7b2d24b5bf..b7f0bbc923 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -1071,6 +1071,25 @@ Sema::InstantiateClassTemplateSpecialization( if (New->isInvalidDecl()) Invalid = true; } + } else if (StaticAssertDecl *SA = dyn_cast<StaticAssertDecl>(*Member)) { + Expr *AssertExpr = SA->getAssertExpr(); + + OwningExprResult InstantiatedAssertExpr + = InstantiateExpr(AssertExpr, + ClassTemplateSpec->getTemplateArgs(), + ClassTemplateSpec->getNumTemplateArgs()); + if (!InstantiatedAssertExpr.isInvalid()) { + OwningExprResult Message = Clone(SA->getMessage()); + + Decl *New = + (Decl *)ActOnStaticAssertDeclaration(SA->getLocation(), + move(InstantiatedAssertExpr), + move(Message)); + if (New->isInvalidDecl()) + Invalid = true; + + } else + Invalid = true; } } |