https://github.com/alejandro-alvarez-sonarsource created
https://github.com/llvm/llvm-project/pull/161641
Treat them as namespaces: if they are at the beginning of the line, they are
likely a good recovery point.
For instance, in
```cpp
1.3.0
extern "C" {
extern int foo();
extern "C++" {
namespace bar {
void baz();
};
}
}
namespace {}
```
Everything until namespace... is gone from the AST. Headers (like libc's C++
`math.h`) can be included from an `extern "C"` contexts, and they do an `extern
"C++"` back again before including C++ headers (like `__type_traits`).
However, a malformed declaration just before the include (as the orphan `1.3.0`
in the example) causes everything from these standard libraries to go missing.
This patch updates the heuristic to try to recover from the first `extern`
keyword seen, pretty much as it is done for `namespace`.
CPP-4478
From 446f4f79aa07b0bef23cfb5ce8b87226651e12fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alejandro=20=C3=81lvarez=20Ayll=C3=B3n?=
<[email protected]>
Date: Fri, 2 Jun 2023 18:38:24 +0200
Subject: [PATCH] [clang] Preserve `externs` following broken declarations
Treat them as namespaces: if they are at the beginning of the line,
they are likely a good recovery point.
CPP-4478
---
clang/lib/Parse/ParseDecl.cpp | 3 +++
.../Parser/recovery-after-expected-unqualified-id.cpp | 9 +++++++++
2 files changed, 12 insertions(+)
create mode 100644 clang/test/Parser/recovery-after-expected-unqualified-id.cpp
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 22c01c4e371f3..d6cd7eb8c2c3d 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -2083,6 +2083,9 @@ void Parser::SkipMalformedDecl() {
return;
break;
+ case tok::kw_extern:
+ // 'extern' at the start of a line is almost certainly a good
+ // place to pick back up parsing
case tok::kw_namespace:
// 'namespace' at the start of a line is almost certainly a good
// place to pick back up parsing, except in an Objective-C
diff --git a/clang/test/Parser/recovery-after-expected-unqualified-id.cpp
b/clang/test/Parser/recovery-after-expected-unqualified-id.cpp
new file mode 100644
index 0000000000000..8019b46df1e7b
--- /dev/null
+++ b/clang/test/Parser/recovery-after-expected-unqualified-id.cpp
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -verify %s
+
+3.2 // expected-error {{expected unqualified-id}}
+
+extern "C" {
+ typedef int Int;
+}
+
+Int foo(); // Ok
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits