diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -222,7 +222,9 @@ on such language mode, ``-Wpre-c2x-compat`` and ``-Wpre-c++2b-compat`` diagnostic flags report a compatibility issue. Fixes `Issue 55306 `_. - +- Clang now checks for stack resource exhaustion when recursively parsing + declarators in order to give a diagnostic before we run out of stack space. + This fixes `Issue 51642 `_. Non-comprehensive list of changes in this release ------------------------------------------------- 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 @@ -5765,11 +5765,12 @@ } /// ParseDeclarator - Parse and verify a newly-initialized declarator. -/// void Parser::ParseDeclarator(Declarator &D) { /// This implements the 'declarator' production in the C grammar, then checks /// for well-formedness and issues diagnostics. - ParseDeclaratorInternal(D, &Parser::ParseDirectDeclarator); + Actions.runWithSufficientStackSpace(D.getBeginLoc(), [&] { + ParseDeclaratorInternal(D, &Parser::ParseDirectDeclarator); + }); } static bool isPtrOperatorToken(tok::TokenKind Kind, const LangOptions &Lang, @@ -5880,7 +5881,9 @@ D.ExtendWithDeclSpec(DS); // Recurse to parse whatever is left. - ParseDeclaratorInternal(D, DirectDeclParser); + Actions.runWithSufficientStackSpace(D.getBeginLoc(), [&] { + ParseDeclaratorInternal(D, DirectDeclParser); + }); // Sema will have to catch (syntactically invalid) pointers into global // scope. It has to catch pointers into namespace scope anyway. @@ -5929,7 +5932,8 @@ D.ExtendWithDeclSpec(DS); // Recursively parse the declarator. - ParseDeclaratorInternal(D, DirectDeclParser); + Actions.runWithSufficientStackSpace( + D.getBeginLoc(), [&] { ParseDeclaratorInternal(D, DirectDeclParser); }); if (Kind == tok::star) // Remember that we parsed a pointer type, and remember the type-quals. D.AddTypeInfo(DeclaratorChunk::getPointer( @@ -5974,7 +5978,8 @@ } // Recursively parse the declarator. - ParseDeclaratorInternal(D, DirectDeclParser); + Actions.runWithSufficientStackSpace( + D.getBeginLoc(), [&] { ParseDeclaratorInternal(D, DirectDeclParser); }); if (D.getNumTypeObjects() > 0) { // C++ [dcl.ref]p4: There shall be no references to references.