diff --git a/.gitignore b/.gitignore --- a/.gitignore +++ b/.gitignore @@ -54,7 +54,3 @@ .vs # clangd index .clangd -<<<<<<< Updated upstream -======= -clang/\.idea/ ->>>>>>> Stashed changes diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -3079,7 +3079,7 @@ SourceLocation &RAngleLoc); bool ParseTemplateParameterList(unsigned Depth, SmallVectorImpl &TemplateParams); - bool isStartOfTemplateTypeParameter(bool &ScopeError); + bool isStartOfTemplateTypeParameter(bool &Error); NamedDecl *ParseTemplateParameter(unsigned Depth, unsigned Position); NamedDecl *ParseTypeParameter(unsigned Depth, unsigned Position); NamedDecl *ParseTemplateTemplateParameter(unsigned Depth, unsigned Position); diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -3472,13 +3472,12 @@ ConsumeAnnotationToken(); SourceLocation AutoLoc = Tok.getLocation(); if (TryConsumeToken(tok::kw_decltype)) { - if (!Tok.is(tok::l_paren)) { + BalancedDelimiterTracker Tracker(*this, tok::l_paren); + if (Tracker.consumeOpen()) { // Something like `void foo(Iterator decltype i)` Diag(Tok, diag::err_expected) << tok::l_paren; } else { - BalancedDelimiterTracker Tracker(*this, tok::l_paren); - Tracker.consumeOpen(); - if (!ExpectAndConsume(tok::kw_auto)) { + if (!TryConsumeToken(tok::kw_auto)) { // Something like `void foo(Iterator decltype(int) i)` Tracker.skipToEnd(); Diag(Tok, diag::err_placeholder_decltype_non_auto) @@ -3489,6 +3488,7 @@ Tracker.consumeClose(); } } + ConsumedEnd = Tok.getLocation(); // Even if something went wrong above, continue as if we've seen // `decltype(auto)`. isInvalid = DS.SetTypeSpecType(TST_decltype_auto, Loc, PrevSpec, diff --git a/clang/lib/Parse/ParseTemplate.cpp b/clang/lib/Parse/ParseTemplate.cpp --- a/clang/lib/Parse/ParseTemplate.cpp +++ b/clang/lib/Parse/ParseTemplate.cpp @@ -501,7 +501,7 @@ /// Determine whether the parser is at the start of a template /// type parameter. -/// \param ScopeError will receive true if there was a parsing error. +/// \param Error will receive true if there was a parsing error. bool Parser::isStartOfTemplateTypeParameter(bool &Error) { Error = false; if (Tok.is(tok::kw_class)) { @@ -611,8 +611,8 @@ // type-constraint is in fact part of a placeholder-type-specifier of a // non-type template parameter. - bool ScopeError; - if (isStartOfTemplateTypeParameter(ScopeError)) { + bool Error; + if (isStartOfTemplateTypeParameter(Error)) { // Is there just a typo in the input code? ('typedef' instead of // 'typename') if (Tok.is(tok::kw_typedef)) { @@ -629,7 +629,7 @@ return ParseTypeParameter(Depth, Position); } - if (ScopeError) { + if (Error) { // We return an invalid parameter as opposed to null to avoid having bogus // diagnostics about an empty template parameter list. // FIXME: Fix ParseTemplateParameterList to better handle nullptr results @@ -679,7 +679,7 @@ /// \returns true if an error occurred, and false otherwise. bool Parser::TryAnnotateTypeConstraint(CXXScopeSpec &SS) { if (!getLangOpts().ConceptsTS) - return true; + return false; if (ParseOptionalCXXScopeSpecifier(SS, ParsedType(), /*EnteringContext=*/false, /*MayBePseudoDestructor=*/nullptr, diff --git a/clang/test/SemaTemplate/ms-delayed-default-template-args.cpp b/clang/test/SemaTemplate/ms-delayed-default-template-args.cpp --- a/clang/test/SemaTemplate/ms-delayed-default-template-args.cpp +++ b/clang/test/SemaTemplate/ms-delayed-default-template-args.cpp @@ -94,6 +94,7 @@ template struct Bar { T x; }; template *P> // expected-error {{use of undeclared identifier 'Xylophone'}} +// expected-note@-1{{template parameter is declared here}} struct Foo { }; typedef int Xylophone;