llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Alejandro Álvarez Ayllón (alejandro-alvarez-sonarsource)

<details>
<summary>Changes</summary>

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

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


2 Files Affected:

- (modified) clang/lib/Parse/ParseDecl.cpp (+3) 
- (added) clang/test/Parser/recovery-after-expected-unqualified-id.cpp (+9) 


``````````diff
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

``````````

</details>


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

Reply via email to