aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Parse/ParseDeclCXX.cpp5
-rw-r--r--lib/Sema/Sema.h3
-rw-r--r--lib/Sema/SemaDeclCXX.cpp6
-rw-r--r--lib/Sema/SemaTemplateInstantiate.cpp19
4 files changed, 25 insertions, 8 deletions
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp
index f534f42ccb..ec91d71b08 100644
--- a/lib/Parse/ParseDeclCXX.cpp
+++ b/lib/Parse/ParseDeclCXX.cpp
@@ -252,13 +252,12 @@ Parser::DeclTy *Parser::ParseStaticAssertDeclaration() {
if (AssertMessage.isInvalid())
return 0;
- SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc);
+ MatchRHSPunctuation(tok::r_paren, LParenLoc);
ExpectAndConsume(tok::semi, diag::err_expected_semi_after_static_assert);
return Actions.ActOnStaticAssertDeclaration(StaticAssertLoc, move(AssertExpr),
- move(AssertMessage),
- RParenLoc);
+ move(AssertMessage));
}
/// ParseClassName - Parse a C++ class-name, which names a class. Note
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;
}
}