[clang] [clang] Fix eager skipping on new with unknown type and no new-initializer (PR #110133)
Alejandro Álvarez Ayllón via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 26 08:22:18 PDT 2024
https://github.com/alejandro-alvarez-sonarsource created https://github.com/llvm/llvm-project/pull/110133
i.e., in `function(new Unknown);` the parser should skip only until the semicolon.
Before this change, everything was skipped until a balanced closing parenthesis or brace was found. This strategy can cause completely bogus ASTs. For instance, in the case of the test `new-unknown-type.cpp`, `struct Bar` would end nested under the namespace `a::b`.
>From 77b65bac9a8893f8272d780e55686b6fdc88d16b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alejandro=20=C3=81lvarez=20Ayll=C3=B3n?=
<alejandro.alvarez at sonarsource.com>
Date: Mon, 20 Feb 2023 16:46:10 +0100
Subject: [PATCH] [clang] Fix eager skipping on new with unknown type and no
new-initializer
i.e. in `function(new Unknown);`, the parser should skip only
until the semicolon.
---
clang/lib/Parse/ParseExpr.cpp | 2 +-
clang/test/AST/new-unknown-type.cpp | 25 +++++++++++++++++++
clang/test/Parser/colon-colon-parentheses.cpp | 2 +-
.../test/Parser/cxx-ambig-paren-expr-asan.cpp | 1 -
4 files changed, 27 insertions(+), 3 deletions(-)
create mode 100644 clang/test/AST/new-unknown-type.cpp
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp
index e7514500dc53a4..2fb4be0035b667 100644
--- a/clang/lib/Parse/ParseExpr.cpp
+++ b/clang/lib/Parse/ParseExpr.cpp
@@ -3694,7 +3694,7 @@ bool Parser::ParseExpressionList(SmallVectorImpl<Expr *> &Exprs,
SawError = true;
if (FailImmediatelyOnInvalidExpr)
break;
- SkipUntil(tok::comma, tok::r_paren, StopBeforeMatch);
+ SkipUntil(tok::comma, tok::r_paren, StopAtSemi | StopBeforeMatch);
} else {
Exprs.push_back(Expr.get());
}
diff --git a/clang/test/AST/new-unknown-type.cpp b/clang/test/AST/new-unknown-type.cpp
new file mode 100644
index 00000000000000..e7dd3c90145d25
--- /dev/null
+++ b/clang/test/AST/new-unknown-type.cpp
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 -verify -ast-dump %s | FileCheck %s
+
+extern void foo(Unknown*); // expected-error {{unknown type name 'Unknown'}}
+
+namespace a {
+ void computeSomething() {
+ foo(new Unknown()); // expected-error {{unknown type name 'Unknown'}}
+ foo(new Unknown{}); // expected-error {{unknown type name 'Unknown'}}
+ foo(new Unknown); // expected-error {{unknown type name 'Unknown'}}
+ }
+} // namespace a
+
+namespace b {
+ struct Bar{};
+} // namespace b
+
+// CHECK: |-NamespaceDecl 0x{{[^ ]*}} <line:5:1, line:11:1> line:5:11 a
+// CHECK-NEXT: | `-FunctionDecl 0x{{[^ ]*}} <line:6:3, line:10:3> line:6:8 computeSomething 'void ()'
+// CHECK-NEXT: | `-CompoundStmt 0x{{[^ ]*}} <col:27, line:10:3>
+// CHECK-NEXT: |-NamespaceDecl 0x{{[^ ]*}} <line:13:1, line:15:1> line:13:11 b
+// CHECK-NEXT: | `-CXXRecordDecl 0x{{[^ ]*}} <line:14:3, col:14> col:10 referenced struct Bar definition
+
+static b::Bar bar;
+// CHECK: `-VarDecl 0x{{[^ ]*}} <line:23:1, col:15> col:15 bar 'b::Bar' static callinit
+// CHECK-NEXT: `-CXXConstructExpr 0x{{[^ ]*}} <col:15> 'b::Bar' 'void () noexcept'
diff --git a/clang/test/Parser/colon-colon-parentheses.cpp b/clang/test/Parser/colon-colon-parentheses.cpp
index b8e203c935990a..018fa7f20e5210 100644
--- a/clang/test/Parser/colon-colon-parentheses.cpp
+++ b/clang/test/Parser/colon-colon-parentheses.cpp
@@ -11,7 +11,7 @@ int S::(*e; // expected-error{{expected unqualified-id}}
int S::*f;
int g = S::(a); // expected-error {{expected unqualified-id}} expected-error {{use of undeclared identifier 'a'}}
int h = S::(b; // expected-error {{expected unqualified-id}} expected-error {{use of undeclared identifier 'b'}}
- );
+ ); // expected-error {{expected unqualified-id}}
int i = S::c;
void foo() {
diff --git a/clang/test/Parser/cxx-ambig-paren-expr-asan.cpp b/clang/test/Parser/cxx-ambig-paren-expr-asan.cpp
index ec9d6b9da39d09..7b9e51f12c95e5 100644
--- a/clang/test/Parser/cxx-ambig-paren-expr-asan.cpp
+++ b/clang/test/Parser/cxx-ambig-paren-expr-asan.cpp
@@ -6,4 +6,3 @@ int H((int()[)]);
// expected-error at -1 {{expected expression}}
// expected-error at -2 {{expected ']'}}
// expected-note at -3 {{to match this '['}}
-// expected-error at -4 {{expected ';' after top level declarator}}
More information about the cfe-commits
mailing list