shafik created this revision.
shafik added reviewers: aaron.ballman, nridge, erichkeane.
Herald added a project: All.
shafik requested review of this revision.

In `Parser::ParseDirectDeclarator(...)` in some cases ill-formed code can cause 
an annotation token to end up where it was not expected. The fix is to add a 
`!Tok.isAnnotation()` guard before attempting to access identifier info.

This fixes:

https://github.com/llvm/llvm-project/issues/64836


https://reviews.llvm.org/D158804

Files:
  clang/lib/Parse/ParseDecl.cpp
  clang/test/Parser/gh64836.cpp


Index: clang/test/Parser/gh64836.cpp
===================================================================
--- /dev/null
+++ clang/test/Parser/gh64836.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -xobjective-c++-header %s
+
+template <typename, typename>
+class C {};
+
+class B {
+  p // expected-error {{unknown type name 'p'}}
+ private: // expected-error {{'private' is a keyword in Objective-C++}}
+  void f() {} // expected-error {{expected '(' for function-style cast or type 
construction}}
+  C<int, decltype(f)> c; // expected-error {{use of undeclared identifier 'f'}}
+  // expected-error@-1 {{expected member name}}
+};
Index: clang/lib/Parse/ParseDecl.cpp
===================================================================
--- clang/lib/Parse/ParseDecl.cpp
+++ clang/lib/Parse/ParseDecl.cpp
@@ -6677,7 +6677,7 @@
       // Objective-C++: Detect C++ keywords and try to prevent further errors 
by
       // treating these keyword as valid member names.
       if (getLangOpts().ObjC && getLangOpts().CPlusPlus &&
-          Tok.getIdentifierInfo() &&
+          !Tok.isAnnotation() && Tok.getIdentifierInfo() &&
           Tok.getIdentifierInfo()->isCPlusPlusKeyword(getLangOpts())) {
         Diag(getMissingDeclaratorIdLoc(D, Tok.getLocation()),
              diag::err_expected_member_name_or_semi_objcxx_keyword)


Index: clang/test/Parser/gh64836.cpp
===================================================================
--- /dev/null
+++ clang/test/Parser/gh64836.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -xobjective-c++-header %s
+
+template <typename, typename>
+class C {};
+
+class B {
+  p // expected-error {{unknown type name 'p'}}
+ private: // expected-error {{'private' is a keyword in Objective-C++}}
+  void f() {} // expected-error {{expected '(' for function-style cast or type construction}}
+  C<int, decltype(f)> c; // expected-error {{use of undeclared identifier 'f'}}
+  // expected-error@-1 {{expected member name}}
+};
Index: clang/lib/Parse/ParseDecl.cpp
===================================================================
--- clang/lib/Parse/ParseDecl.cpp
+++ clang/lib/Parse/ParseDecl.cpp
@@ -6677,7 +6677,7 @@
       // Objective-C++: Detect C++ keywords and try to prevent further errors by
       // treating these keyword as valid member names.
       if (getLangOpts().ObjC && getLangOpts().CPlusPlus &&
-          Tok.getIdentifierInfo() &&
+          !Tok.isAnnotation() && Tok.getIdentifierInfo() &&
           Tok.getIdentifierInfo()->isCPlusPlusKeyword(getLangOpts())) {
         Diag(getMissingDeclaratorIdLoc(D, Tok.getLocation()),
              diag::err_expected_member_name_or_semi_objcxx_keyword)
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D158804: [Clang] F... Shafik Yaghmour via Phabricator via cfe-commits

Reply via email to