Skip to content

Commit

Permalink
[clang] Improve error recovery for pack expansion of expressions
Browse files Browse the repository at this point in the history
Closes #58673.

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

Differential Revision: https://reviews.llvm.org/D136962
  • Loading branch information
mizvekov committed Oct 31, 2022
1 parent 5fd03c8 commit 2492c52
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 3 deletions.
2 changes: 2 additions & 0 deletions clang/docs/ReleaseNotes.rst
Expand Up @@ -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
-------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/AST/ComputeDependence.cpp
Expand Up @@ -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.
Expand Down
15 changes: 13 additions & 2 deletions 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;
Expand Down Expand Up @@ -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'}}
Expand Down Expand Up @@ -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>()...);
Expand Down Expand Up @@ -491,3 +494,11 @@ template <bool... I> struct E {
using t2 = E<true>::B<false>;
// expected-note@-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

0 comments on commit 2492c52

Please sign in to comment.