llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Rajin Khan (rajin-khan)

<details>
<summary>Changes</summary>

Fixes #<!-- -->165246.

When recovery sees `decltype` without an opening parenthesis while token 
backtracking is active, `ParseDecltypeSpecifier` returns the token's start 
location. `AnnotatePreviousCachedTokens` requires the annotation end to match 
the last location of the most recently cached token, so malformed input such as 
`int decltype {}` trips its assertion.

Use the last cached token location for an invalid decltype specifier after 
rewinding the lookahead token. This is the same recovery pattern used by the 
adjacent pack indexing annotation path.

The existing `decltype-crash.cpp` test now covers the brace form from the 
report.

Testing:

- `clang++ -cc1 -fsyntax-only -verify -std=c++11 
clang/test/Parser/decltype-crash.cpp`
- `clang++ -cc1 -fsyntax-only -verify -std=c++20 
clang/test/Parser/decltype-crash.cpp`
- `git diff --check`

The focused verification commands used Apple Clang 21.0.0. The 
assertion-specific path was reviewed against the current preprocessor cache 
invariant; this checkout does not contain a locally built assertions-enabled 
Clang.


---
Full diff: https://github.com/llvm/llvm-project/pull/224844.diff


2 Files Affected:

- (modified) clang/lib/Parse/ParseDeclCXX.cpp (+2) 
- (modified) clang/test/Parser/decltype-crash.cpp (+4) 


``````````diff
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index 1eeb0d21b68d7..dade5ab3c9e82 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -1110,6 +1110,8 @@ void Parser::AnnotateExistingDecltypeSpecifier(const 
DeclSpec &DS,
   // make sure we have a token we can turn into an annotation token
   if (PP.isBacktrackEnabled()) {
     PP.RevertCachedTokens(1);
+    if (DS.getTypeSpecType() == TST_error)
+      EndLoc = PP.getLastCachedTokenLocation();
   } else
     PP.EnterToken(Tok, /*IsReinject*/ true);
 
diff --git a/clang/test/Parser/decltype-crash.cpp 
b/clang/test/Parser/decltype-crash.cpp
index af4622df5e54a..d91229b3a6692 100644
--- a/clang/test/Parser/decltype-crash.cpp
+++ b/clang/test/Parser/decltype-crash.cpp
@@ -13,3 +13,7 @@ int decltype = 0;
 int *decltype = 0;
 // expected-error@-1 {{expected '(' after 'decltype'}}
 // expected-error@-2 {{expected unqualified-id}}
+
+int decltype {}
+// expected-error@-1 {{expected '(' after 'decltype'}}
+// expected-error@-2 {{expected unqualified-id}}

``````````

</details>


https://github.com/llvm/llvm-project/pull/224844
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to