<div dir="ltr">Hi Richard,<div><br></div><div>It looks like this commit caused PR34298 (<a href="https://bugs.llvm.org/show_bug.cgi?id=34298" target="_blank">https://bugs.llvm.org/show_bu<wbr>g.cgi?id=34298</a>). Now Clang fails to compile a libc++ std::function member variable with an incomplete return type. Libstdc++ works though, so I assume that the right way to fix this is to change libc++? </div><div><br></div><div>Cheers,</div><div>Alex</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 19 October 2016 at 00:39, Richard Smith via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rsmith<br>
Date: Tue Oct 18 18:39:12 2016<br>
New Revision: 284549<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=284549&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=284549&view=rev</a><br>
Log:<br>
DR1330: instantiate exception-specifications when "needed". We previously did<br>
not instantiate exception specifications of functions if they were only used in<br>
unevaluated contexts (other than 'noexcept' expressions).<br>
<br>
In C++17 onwards, this becomes essential since the exception specification is<br>
now part of the function's type.<br>
<br>
Note that this means that constructs like the following no longer work:<br>
<br>
  struct A {<br>
    static T f() noexcept(...);<br>
    decltype(f()) *p;<br>
  };<br>
<br>
... because the decltype expression now needs the exception specification of<br>
'f', which has not yet been parsed.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/SemaExpr.<wbr>cpp<br>
    cfe/trunk/lib/Sema/<wbr>SemaOverload.cpp<br>
    cfe/trunk/test/CXX/drs/dr13xx.<wbr>cpp<br>
    cfe/trunk/test/SemaCXX/<wbr>constant-expression-cxx1z.cpp<br>
    cfe/trunk/test/SemaCXX/cxx0x-<wbr>defaulted-functions.cpp<br>
    cfe/trunk/test/SemaCXX/<wbr>libstdcxx_pair_swap_hack.cpp<br>
    cfe/trunk/test/SemaTemplate/<wbr>instantiate-exception-spec-<wbr>cxx11.cpp<br>
    cfe/trunk/www/cxx_dr_status.<wbr>html<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExpr.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=284549&r1=284548&r2=284549&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaExpr.cpp?rev=284549&r1=<wbr>284548&r2=284549&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/SemaExpr.<wbr>cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExpr.<wbr>cpp Tue Oct 18 18:39:12 2016<br>
@@ -2889,6 +2889,14 @@ ExprResult Sema::BuildDeclarationNameExp<br>
<br>
   {<br>
     QualType type = VD->getType();<br>
+    if (auto *FPT = type->getAs<FunctionProtoType><wbr>()) {<br>
+      // C++ [except.spec]p17:<br>
+      //   An exception-specification is considered to be needed when:<br>
+      //   - in an expression, the function is the unique lookup result or<br>
+      //     the selected member of a set of overloaded functions.<br>
+      ResolveExceptionSpec(Loc, FPT);<br>
+      type = VD->getType();<br>
+    }<br>
     ExprValueKind valueKind = VK_RValue;<br>
<br>
     switch (D->getKind()) {<br>
@@ -13138,6 +13146,19 @@ void Sema::MarkFunctionReferenced(<wbr>Source<br>
        Func-><wbr>getMemberSpecializationInfo())<wbr>)<br>
     checkSpecializationVisibility(<wbr>Loc, Func);<br>
<br>
+  // C++14 [except.spec]p17:<br>
+  //   An exception-specification is considered to be needed when:<br>
+  //   - the function is odr-used or, if it appears in an unevaluated operand,<br>
+  //     would be odr-used if the expression were potentially-evaluated;<br>
+  //<br>
+  // Note, we do this even if MightBeOdrUse is false. That indicates that the<br>
+  // function is a pure virtual function we're calling, and in that case the<br>
+  // function was selected by overload resolution and we need to resolve its<br>
+  // exception specification for a different reason.<br>
+  const FunctionProtoType *FPT = Func->getType()->getAs<<wbr>FunctionProtoType>();<br>
+  if (FPT && isUnresolvedExceptionSpec(FPT-<wbr>>getExceptionSpecType()))<br>
+    ResolveExceptionSpec(Loc, FPT);<br>
+<br>
   // If we don't need to mark the function as used, and we don't need to<br>
   // try to provide a definition, there's nothing more to do.<br>
   if ((Func->isUsed(/*<wbr>CheckUsedAttr=*/false) || !OdrUse) &&<br>
@@ -13196,12 +13217,6 @@ void Sema::MarkFunctionReferenced(<wbr>Source<br>
   // FIXME: Is this really right?<br>
   if (CurContext == Func) return;<br>
<br>
-  // Resolve the exception specification for any function which is<br>
-  // used: CodeGen will need it.<br>
-  const FunctionProtoType *FPT = Func->getType()->getAs<<wbr>FunctionProtoType>();<br>
-  if (FPT && isUnresolvedExceptionSpec(FPT-<wbr>>getExceptionSpecType()))<br>
-    ResolveExceptionSpec(Loc, FPT);<br>
-<br>
   // Implicit instantiation of function templates and member functions of<br>
   // class templates.<br>
   if (Func-><wbr>isImplicitlyInstantiable()) {<br>
<br>
Modified: cfe/trunk/lib/Sema/<wbr>SemaOverload.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=284549&r1=284548&r2=284549&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaOverload.cpp?rev=284549&<wbr>r1=284548&r2=284549&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/<wbr>SemaOverload.cpp (original)<br>
+++ cfe/trunk/lib/Sema/<wbr>SemaOverload.cpp Tue Oct 18 18:39:12 2016<br>
@@ -13166,6 +13166,13 @@ Expr *Sema::<wbr>FixOverloadedFunctionReferen<br>
                                        UnOp->getOperatorLoc());<br>
   }<br>
<br>
+  // C++ [except.spec]p17:<br>
+  //   An exception-specification is considered to be needed when:<br>
+  //   - in an expression the function is the unique lookup result or the<br>
+  //     selected member of a set of overloaded functions<br>
+  if (auto *FPT = Fn->getType()->getAs<<wbr>FunctionProtoType>())<br>
+    ResolveExceptionSpec(E-><wbr>getExprLoc(), FPT);<br>
+<br>
   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr><wbr>(E)) {<br>
     // FIXME: avoid copy.<br>
     TemplateArgumentListInfo TemplateArgsBuffer, *TemplateArgs = nullptr;<br>
<br>
Modified: cfe/trunk/test/CXX/drs/dr13xx.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr13xx.cpp?rev=284549&r1=284548&r2=284549&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/CXX/<wbr>drs/dr13xx.cpp?rev=284549&r1=<wbr>284548&r2=284549&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CXX/drs/dr13xx.<wbr>cpp (original)<br>
+++ cfe/trunk/test/CXX/drs/dr13xx.<wbr>cpp Tue Oct 18 18:39:12 2016<br>
@@ -3,6 +3,91 @@<br>
 // RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors<br>
 // RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors<br>
<br>
+namespace dr1330 { // dr1330: 4.0 c++11<br>
+  // exception-specifications are parsed in a context where the class is complete.<br>
+  struct A {<br>
+    void f() throw(T) {}<br>
+    struct T {};<br>
+<br>
+#if __cplusplus >= 201103L<br>
+    void g() noexcept(&a == b) {}<br>
+    static int a;<br>
+    static constexpr int *b = &a;<br>
+#endif<br>
+  };<br>
+<br>
+  void (A::*af1)() throw(A::T) = &A::f;<br>
+  void (A::*af2)() throw() = &A::f; // expected-error-re {{{{not superset|different exception spec}}}}<br>
+<br>
+#if __cplusplus >= 201103L<br>
+  static_assert(noexcept(A().g()<wbr>), "");<br>
+#endif<br>
+<br>
+  // Likewise, they're instantiated separately from an enclosing class template.<br>
+  template<typename U><br>
+  struct B {<br>
+    void f() throw(T, typename U::type) {}<br>
+    struct T {};<br>
+<br>
+#if __cplusplus >= 201103L<br>
+    void g() noexcept(&a == b && U::value) {}<br>
+    static int a;<br>
+    static constexpr int *b = &a;<br>
+#endif<br>
+  };<br>
+<br>
+  B<int> bi; // ok<br>
+<br>
+  struct P {<br>
+    typedef int type;<br>
+    static const int value = true;<br>
+  };<br>
+<br>
+  void (B<P>::*bpf1)() throw(B<P>::T, int) = &B<P>::f;<br>
+#if __cplusplus < 201103L<br>
+  // expected-error@-2 {{not superset}}<br>
+  // FIXME: We only delay instantiation in C++11 onwards. In C++98, something<br>
+  // weird happens: instantiation of B<P> fails because it references T before<br>
+  // it's instantiated, but the diagnostic is suppressed in<br>
+  // Sema::FindInstantiatedDecl because we've already hit an error. This is<br>
+  // obviously a bad way to react to this situation; we should still producing<br>
+  // the "T has not yet been instantiated" error here, rather than giving<br>
+  // confusing errors later on.<br>
+#endif<br>
+  void (B<P>::*bpf2)() throw(int) = &B<P>::f; // expected-error-re {{{{not superset|different exception spec}}}}<br>
+  void (B<P>::*bpf3)() = &B<P>::f;<br>
+<br>
+#if __cplusplus >= 201103L<br>
+  static_assert(noexcept(B<P>().<wbr>g()), "");<br>
+  struct Q { static const int value = false; };<br>
+  static_assert(!noexcept(B<Q>()<wbr>.g()), "");<br>
+#endif<br>
+<br>
+  template<typename T> int f() throw(typename T::error) { return 0; } // expected-error 1-4{{prior to '::'}} expected-note 0-1{{instantiation of}}<br>
+  // An exception-specification is needed even if the function is only used in<br>
+  // an unevaluated operand.<br>
+  int f1 = sizeof(f<int>()); // expected-note {{instantiation of}}<br>
+#if __cplusplus >= 201103L<br>
+  decltype(f<char>()) f2; // expected-note {{instantiation of}}<br>
+  bool f3 = noexcept(f<float>()); // expected-note {{instantiation of}}<br>
+#endif<br>
+  template int f<short>(); // expected-note {{instantiation of}}<br>
+<br>
+  template<typename T> struct C {<br>
+    C() throw(typename T::type); // expected-error 1-2{{prior to '::'}}<br>
+  };<br>
+  struct D : C<void> {}; // ok<br>
+#if __cplusplus < 201103L<br>
+  // expected-note@-2 {{instantiation of}}<br>
+#endif<br>
+  void f(D &d) { d = d; } // ok<br>
+<br>
+  // FIXME: In C++11 onwards, we should also note the declaration of 'e' as the<br>
+  // line that triggers the use of E::E()'s exception specification.<br>
+  struct E : C<int> {}; // expected-note {{in instantiation of}}<br>
+  E e;<br>
+}<br>
+<br>
 namespace dr1346 { // dr1346: 3.5<br>
   auto a(1); // expected-error 0-1{{extension}}<br>
   auto b(1, 2); // expected-error {{multiple expressions}} expected-error 0-1{{extension}}<br>
<br>
Modified: cfe/trunk/test/SemaCXX/<wbr>constant-expression-cxx1z.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx1z.cpp?rev=284549&r1=284548&r2=284549&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaCXX/constant-expression-<wbr>cxx1z.cpp?rev=284549&r1=<wbr>284548&r2=284549&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaCXX/<wbr>constant-expression-cxx1z.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/<wbr>constant-expression-cxx1z.cpp Tue Oct 18 18:39:12 2016<br>
@@ -25,3 +25,15 @@ namespace BaseClassAggregateInit {<br>
   constexpr D d5 = { __INT_MAX__ }; // expected-error {{must be initialized by a constant expression}}<br>
   // expected-note-re@-1 {{in call to 'A({{.*}})'}}<br>
 }<br>
+<br>
+namespace NoexceptFunctionTypes {<br>
+  template<typename T> constexpr bool f() noexcept(true) { return true; }<br>
+  static_assert(f<int>());<br>
+<br>
+  template<typename T> struct A {<br>
+    constexpr bool f() noexcept(true) { return true; }<br>
+    constexpr bool g() { return f(); }<br>
+  };<br>
+  static_assert(A<int>().f());<br>
+  static_assert(A<int>().g());<br>
+}<br>
<br>
Modified: cfe/trunk/test/SemaCXX/cxx0x-<wbr>defaulted-functions.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-defaulted-functions.cpp?rev=284549&r1=284548&r2=284549&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaCXX/cxx0x-defaulted-<wbr>functions.cpp?rev=284549&r1=<wbr>284548&r2=284549&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaCXX/cxx0x-<wbr>defaulted-functions.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/cxx0x-<wbr>defaulted-functions.cpp Tue Oct 18 18:39:12 2016<br>
@@ -89,30 +89,34 @@ namespace DefaultedFnExceptionSpec {<br>
   struct Error {<br>
     void f() noexcept(T::error);<br>
<br>
-    Error() noexcept(T::error); // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}<br>
-    Error(const Error&) noexcept(T::error);<br>
-    Error(Error&&) noexcept(T::error);<br>
-    Error &operator=(const Error&) noexcept(T::error);<br>
-    Error &operator=(Error&&) noexcept(T::error);<br>
-    ~Error() noexcept(T::error); // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}<br>
+    Error() noexcept(T::error); // expected-error {{type 'int' cannot be used prior to '::' because it has no members}} expected-error {{type 'char'}}<br>
+    Error(const Error&) noexcept(T::error); // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}<br>
+    Error(Error&&) noexcept(T::error); // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}<br>
+    Error &operator=(const Error&) noexcept(T::error); // expected-error {{type 'int' cannot be used prior to '::' because it has no members}} expected-error {{type 'double'}}<br>
+    Error &operator=(Error&&) noexcept(T::error); // expected-error {{type 'int' cannot be used prior to '::' because it has no members}}<br>
+    ~Error() noexcept(T::error); // expected-error {{type 'int' cannot be used prior to '::' because it has no members}} expected-error {{type 'char'}}<br>
   };<br>
<br>
+  Error<char> c; // expected-note 2{{instantiation of}}<br>
   struct DelayImplicit {<br>
-    Error<int> e;<br>
+    // FIXME: The location of this note is terrible. The instantiation was<br>
+    // triggered by the uses of the functions in the decltype expressions below.<br>
+    Error<int> e; // expected-note 6{{instantiation of}}<br>
   };<br>
+  Error<float> *e;<br>
<br>
-  // Don't instantiate the exception specification here.<br>
+  // An exception specification is needed if the exception specification for a<br>
+  // a defaulted special member function that calls the function is needed.<br>
+  // Use in an unevaluated operand still results in the exception spec being<br>
+  // needed.<br>
   void test1(decltype(declval<<wbr>DelayImplicit>() = DelayImplicit(DelayImplicit())<wbr>));<br>
   void test2(decltype(declval<<wbr>DelayImplicit>() = declval<const DelayImplicit>()));<br>
   void test3(decltype(DelayImplicit(<wbr>declval<const DelayImplicit>())));<br>
<br>
-  // Any odr-use causes the exception specification to be evaluated.<br>
-  struct OdrUse { // \<br>
-    expected-note {{instantiation of exception specification for 'Error'}} \<br>
-    expected-note {{instantiation of exception specification for '~Error'}}<br>
-    Error<int> e;<br>
-  };<br>
-  OdrUse use; // expected-note {{implicit default constructor for 'DefaultedFnExceptionSpec::<wbr>OdrUse' first required here}}<br>
+  // Any odr-use needs the exception specification.<br>
+  void f(Error<double> *p) {<br>
+    *p = *p; // expected-note {{instantiation of}}<br>
+  }<br>
 }<br>
<br>
 namespace PR13527 {<br>
<br>
Modified: cfe/trunk/test/SemaCXX/<wbr>libstdcxx_pair_swap_hack.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/libstdcxx_pair_swap_hack.cpp?rev=284549&r1=284548&r2=284549&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaCXX/libstdcxx_pair_swap_<wbr>hack.cpp?rev=284549&r1=284548&<wbr>r2=284549&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaCXX/<wbr>libstdcxx_pair_swap_hack.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/<wbr>libstdcxx_pair_swap_hack.cpp Tue Oct 18 18:39:12 2016<br>
@@ -69,6 +69,7 @@ namespace sad {<br>
<br>
   template<typename A, typename B> struct CLASS {<br>
     void swap(CLASS &other) noexcept(noexcept(swap(*this, other))); // expected-error {{too many arguments}} expected-note {{declared here}}<br>
+    // expected-error@-1{{uses itself}} expected-note@-1{{in instantiation of}}<br>
   };<br>
<br>
   CLASS<int, int> pi;<br>
<br>
Modified: cfe/trunk/test/SemaTemplate/<wbr>instantiate-exception-spec-<wbr>cxx11.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp?rev=284549&r1=284548&r2=284549&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaTemplate/instantiate-<wbr>exception-spec-cxx11.cpp?rev=<wbr>284549&r1=284548&r2=284549&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaTemplate/<wbr>instantiate-exception-spec-<wbr>cxx11.cpp (original)<br>
+++ cfe/trunk/test/SemaTemplate/<wbr>instantiate-exception-spec-<wbr>cxx11.cpp Tue Oct 18 18:39:12 2016<br>
@@ -30,8 +30,6 @@ template<unsigned N> struct S {<br>
   // expected-error {{no member named 'recurse'}} \<br>
   // expected-note 9{{instantiation of exception spec}}<br>
 };<br>
-decltype(S<0>::recurse()) *pVoid1 = 0; // ok, exception spec not needed<br>
-decltype(&S<0>::recurse) pFn = 0; // ok, exception spec not needed<br>
<br>
 template<> struct S<10> {};<br>
 void (*pFn2)() noexcept = &S<0>::recurse; // expected-note {{instantiation of exception spec}} expected-error {{not superset}}<br>
@@ -39,7 +37,7 @@ void (*pFn2)() noexcept = &S<0>::recurse<br>
<br>
 namespace dr1330_example {<br>
   template <class T> struct A {<br>
-    void f(...) throw (typename T::X); // expected-error {{'int'}}<br>
+    void f(...) throw (typename T::X);<br>
     void f(int);<br>
   };<br>
<br>
@@ -48,16 +46,14 @@ namespace dr1330_example {<br>
   }<br>
<br>
   struct S {<br>
-    template<typename T><br>
-    static int f() noexcept(noexcept(A<T>().f("<wbr>boo!"))) { return 0; } // \<br>
-    // expected-note {{instantiation of exception spec}}<br>
-    typedef decltype(f<S>()) X;<br>
+    template<typename T> static void f() throw(typename T::X);<br>
+    typedef decltype(f<S>()) X; // expected-error {{exception specification is not available}}<br>
   };<br>
<br>
-  int test2() {<br>
-    S().f<S>(); // ok<br>
-    S().f<int>(); // expected-note {{instantiation of exception spec}}<br>
-  }<br>
+  struct T {<br>
+    template<typename T> static void f() throw(T**);<br>
+    typedef decltype(f<S>()) X; // expected-error {{exception specification is not available}}<br>
+  };<br>
<br>
   template<typename T><br>
   struct U {<br>
<br>
Modified: cfe/trunk/www/cxx_dr_status.<wbr>html<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_dr_status.html?rev=284549&r1=284548&r2=284549&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/www/cxx_dr_<wbr>status.html?rev=284549&r1=<wbr>284548&r2=284549&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/www/cxx_dr_status.<wbr>html (original)<br>
+++ cfe/trunk/www/cxx_dr_status.<wbr>html Tue Oct 18 18:39:12 2016<br>
@@ -3613,7 +3613,7 @@ and <I>POD class</I></td><br>
     <td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#595" rel="noreferrer" target="_blank">http://www.open-std.org/<wbr>jtc1/sc22/wg21/docs/cwg_<wbr>closed.html#595</a>">595</a></td><br>
     <td>dup</td><br>
     <td>Exception specifications in templates instantiated from class bodies</td><br>
-    <td class="none" align="center">Duplicate of <a href="#1330">1330</a></td><br>
+    <td class="svn" align="center">Duplicate of <a href="#1330">1330</a></td><br>
   </tr><br>
   <tr class="open" id="596"><br>
     <td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#596" rel="noreferrer" target="_blank">http://www.open-std.org/<wbr>jtc1/sc22/wg21/docs/cwg_<wbr>active.html#596</a>">596</a></td><br>
@@ -7795,7 +7795,7 @@ and <I>POD class</I></td><br>
     <td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1330" rel="noreferrer" target="_blank">http://www.open-std.org/<wbr>jtc1/sc22/wg21/docs/cwg_<wbr>defects.html#1330</a>">1330</a></<wbr>td><br>
     <td>CD3</td><br>
     <td>Delayed instantiation of <TT>noexcept</TT> specifiers</td><br>
-    <td class="none" align="center">Unknown</td><br>
+    <td class="svn" align="center">SVN (C++11 onwards)</td><br>
   </tr><br>
   <tr class="open" id="1331"><br>
     <td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#1331" rel="noreferrer" target="_blank">http://www.open-std.org/<wbr>jtc1/sc22/wg21/docs/cwg_<wbr>closed.html#1331</a>">1331</a></<wbr>td><br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>