================
@@ -61,8 +61,26 @@ bool Parser::isCXXDeclarationStatement(
// token is also an identifier and assume a declaration.
// We cannot check if the scopes match because the declarations could
// involve namespaces and friend declarations.
- if (NextToken().is(tok::identifier))
+ //
+ // Also handle cases like "A::B *foo" or "A::B &foo" where the type
+ // is followed by ptr/ref declarator operators. These patterns are
+ // very likely to be declarations (e.g., out-of-line member function
+ // definitions with pointer/reference return types).
+ Token Next = NextToken();
+ if (Next.is(tok::identifier))
return true;
+ // Check for pointer/reference patterns: A::B *id, A::B &id, A::B
&&id
+ // Also handles multiple indirections like A::B **id
+ if (Next.isOneOf(tok::star, tok::amp, tok::ampamp)) {
+ // Look ahead to see if there's an identifier after ptr/ref ops
+ RevertingTentativeParsingAction PA(*this);
+ ConsumeToken(); // consume the identifier (type name)
+ // Skip all consecutive *, &, && tokens (for cases like A::B **)
+ while (Tok.isOneOf(tok::star, tok::amp, tok::ampamp))
----------------
vgvassilev wrote:
I presume the c++ scope specifier has been parsed already. In this case we
should call a parser function rather than implementing some parsing by
ourselves. You can trace what clang does for out-of-line definitions after
calling `ParseOptionalCXXScopeSpecifier`. We should do the same and if that
fails we know that this is not a declaration, more parsing will be required
otherwise.
https://github.com/llvm/llvm-project/pull/169272
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits