@@ -167,9 +167,13 @@ Parser::DeclGroupPtrTy Parser::ParseTemplateDeclarationOrSpecialization(
167167 LastParamListWasEmpty);
168168
169169 // Parse the actual template declaration.
170- if (Tok.is (tok::kw_concept))
171- return Actions.ConvertDeclToDeclGroup (
172- ParseConceptDefinition (TemplateInfo, DeclEnd));
170+ if (Tok.is (tok::kw_concept)) {
171+ Decl *ConceptDecl = ParseConceptDefinition (TemplateInfo, DeclEnd);
172+ // We need to explicitly pass ConceptDecl to ParsingDeclRAIIObject, so that
173+ // delayed diagnostics (e.g. warn_deprecated) have a Decl to work with.
174+ ParsingTemplateParams.complete (ConceptDecl);
175+ return Actions.ConvertDeclToDeclGroup (ConceptDecl);
176+ }
173177
174178 return ParseDeclarationAfterTemplate (
175179 Context, TemplateInfo, ParsingTemplateParams, DeclEnd, AccessAttrs, AS);
@@ -316,7 +320,8 @@ Parser::ParseConceptDefinition(const ParsedTemplateInfo &TemplateInfo,
316320 const IdentifierInfo *Id = Result.Identifier ;
317321 SourceLocation IdLoc = Result.getBeginLoc ();
318322
319- DiagnoseAndSkipCXX11Attributes ();
323+ ParsedAttributes Attrs (AttrFactory);
324+ MaybeParseAttributes (PAKM_GNU | PAKM_CXX11, Attrs);
320325
321326 if (!TryConsumeToken (tok::equal)) {
322327 Diag (Tok.getLocation (), diag::err_expected) << tok::equal;
@@ -335,8 +340,8 @@ Parser::ParseConceptDefinition(const ParsedTemplateInfo &TemplateInfo,
335340 ExpectAndConsumeSemi (diag::err_expected_semi_declaration);
336341 Expr *ConstraintExpr = ConstraintExprResult.get ();
337342 return Actions.ActOnConceptDefinition (getCurScope (),
338- *TemplateInfo.TemplateParams ,
339- Id, IdLoc, ConstraintExpr );
343+ *TemplateInfo.TemplateParams , Id, IdLoc,
344+ ConstraintExpr, Attrs );
340345}
341346
342347// / ParseTemplateParameters - Parses a template-parameter-list enclosed in
0 commit comments