[clang] 2492c52 - [clang] Improve error recovery for pack expansion of expressions

Matheus Izvekov via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 31 09:58:25 PDT 2022


Author: Matheus Izvekov
Date: 2022-10-31T17:57:13+01:00
New Revision: 2492c52a05bcad4fab440ac13632051645d66678

URL: https://github.com/llvm/llvm-project/commit/2492c52a05bcad4fab440ac13632051645d66678
DIFF: https://github.com/llvm/llvm-project/commit/2492c52a05bcad4fab440ac13632051645d66678.diff

LOG: [clang] Improve error recovery for pack expansion of expressions

Closes #58673.

Signed-off-by: Matheus Izvekov <mizvekov at gmail.com>

Differential Revision: https://reviews.llvm.org/D136962

Added: 
    

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/AST/ComputeDependence.cpp
    clang/test/CXX/temp/temp.decls/temp.variadic/p5.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index e00ea45b986dd..95910fd9f4269 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -346,6 +346,8 @@ Improvements to Clang's diagnostics
   potentially problematic function type casts.
 - Clang will now disambiguate NTTP types when printing diagnostic that contain NTTP types.
   Fixes `Issue 57562 <https://github.com/llvm/llvm-project/issues/57562>`_.
+- Better error recovery for pack expansion of expressions.
+  `Issue 58673 <https://github.com/llvm/llvm-project/issues/58673>`_.
 
 Non-comprehensive list of changes in this release
 -------------------------------------------------

diff  --git a/clang/lib/AST/ComputeDependence.cpp b/clang/lib/AST/ComputeDependence.cpp
index 334897b32403f..40ebde06d7718 100644
--- a/clang/lib/AST/ComputeDependence.cpp
+++ b/clang/lib/AST/ComputeDependence.cpp
@@ -573,7 +573,7 @@ ExprDependence clang::computeDependence(RecoveryExpr *E) {
   //   - type-dependent if we don't know the type (fallback to an opaque
   //     dependent type), or the type is known and dependent, or it has
   //     type-dependent subexpressions.
-  auto D = toExprDependenceForImpliedType(E->getType()->getDependence()) |
+  auto D = toExprDependenceAsWritten(E->getType()->getDependence()) |
            ExprDependence::ErrorDependent;
   // FIXME: remove the type-dependent bit from subexpressions, if the
   // RecoveryExpr has a non-dependent type.

diff  --git a/clang/test/CXX/temp/temp.decls/temp.variadic/p5.cpp b/clang/test/CXX/temp/temp.decls/temp.variadic/p5.cpp
index abc0bc93e4387..fb8d931710cad 100644
--- a/clang/test/CXX/temp/temp.decls/temp.variadic/p5.cpp
+++ b/clang/test/CXX/temp/temp.decls/temp.variadic/p5.cpp
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -std=c++11 -fblocks -fms-extensions -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -std=c++11 -fblocks -fms-extensions -fsyntax-only -verify=expected,cxx11 %s
+// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -std=c++2b -fblocks -fms-extensions -fsyntax-only -verify=expected %s
 
 template<typename T, typename U> struct pair;
 template<typename ...> struct tuple;
@@ -164,7 +165,9 @@ template<typename T, typename... Types>
 // FIXME: this should test that the diagnostic reads "type contains..."
 struct alignas(Types) TestUnexpandedDecls : T{ // expected-error{{expression contains unexpanded parameter pack 'Types'}}
   void member_function(Types);  // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
+#if __cplusplus < 201703L
   void member_function () throw(Types); // expected-error{{exception type contains unexpanded parameter pack 'Types'}}
+#endif
   void member_function2() noexcept(Types()); // expected-error{{expression contains unexpanded parameter pack 'Types'}}
   operator Types() const; // expected-error{{declaration type contains unexpanded parameter pack 'Types'}}
   Types data_member;  // expected-error{{data member type contains unexpanded parameter pack 'Types'}}
@@ -427,7 +430,7 @@ namespace PR16303 {
 namespace PR21289 {
   template<int> using T = int;
   template<typename> struct S { static const int value = 0; };
-  template<typename> const int vt = 0; // expected-warning {{extension}}
+  template<typename> const int vt = 0; // cxx11-warning {{extension}}
   int f(...);
   template<int ...Ns> void g() {
     f(T<Ns>()...);
@@ -491,3 +494,11 @@ template <bool... I> struct E {
 using t2 = E<true>::B<false>;
 // expected-note at -1 {{in instantiation of template class 'pr56094::E<true>' requested here}}
 } // namespace pr56094
+
+namespace GH56094 {
+#if __cplusplus >= 201402L
+template <class> struct A; // expected-note {{template is declared here}}
+template <class> using B = char;
+template <class ...Cs> int C{ A<B<Cs>>{}... }; // expected-error {{implicit instantiation of undefined template}}
+#endif
+} // namespace GH56094


        


More information about the cfe-commits mailing list