diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -3325,7 +3325,6 @@ switch (getExceptionSpecType()) { case EST_Unparsed: case EST_Unevaluated: - case EST_Uninstantiated: llvm_unreachable("should not call this with unresolved exception specs"); case EST_DynamicNone: @@ -3347,6 +3346,7 @@ return CT_Can; return CT_Dependent; + case EST_Uninstantiated: case EST_DependentNoexcept: return CT_Dependent; } diff --git a/clang/test/SemaTemplate/class-template-noexcept.cpp b/clang/test/SemaTemplate/class-template-noexcept.cpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaTemplate/class-template-noexcept.cpp @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -verify %s +// RUN: %clang_cc1 -std=c++11 -verify %s +// RUN: %clang_cc1 -std=c++17 -verify %s +// RUN: %clang_cc1 -std=c++1z -verify %s +#if __cplusplus >= 201703 +// expected-no-diagnostics +#endif +class A { +public: + static const char X; +}; +const char A::X = 0; + +template void func() noexcept(U::X); + +template +#if __cplusplus >= 201703 +void foo(void(B...) noexcept(x)) {} +#else +void foo(void(B...) noexcept(x)) {} // expected-note{{candidate template ignored}} +#endif + +void bar() +{ +#if __cplusplus >= 201703 + foo(func); +#else + foo(func); // expected-error{{no matching function for call}} +#endif +} + +