Commit db2db17e authored by Bill Wendling's avatar Bill Wendling
Browse files

Merging r155975:

------------------------------------------------------------------------
r155975 | rsmith | 2012-05-01 18:29:43 -0700 (Tue, 01 May 2012) | 4 lines

Disable our non-standard delayed parsing of exception specifications. Delaying
the parsing of such things appears to be a conforming extension, but it breaks
libstdc++4.7's std::pair.

------------------------------------------------------------------------

llvm-svn: 156672
parent b37b039f
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -4266,10 +4266,16 @@ void Parser::ParseFunctionDeclarator(Declarator &D,
                               IsCXX11MemberFunction);
      
      // Parse exception-specification[opt].
      // FIXME: Remove the code to perform delayed parsing of exception
      //        specifications.
#if 0
      bool Delayed = (D.getContext() == Declarator::MemberContext &&
                      D.getDeclSpec().getStorageClassSpec()
                        != DeclSpec::SCS_typedef &&
                      !D.getDeclSpec().isFriendSpecified());
#else
      const bool Delayed = false;
#endif
      ESpecType = tryParseExceptionSpecification(Delayed,
                                                 ESpecRange,
                                                 DynamicExceptions,
+3 −2
Original line number Diff line number Diff line
@@ -91,10 +91,11 @@ namespace Static {

namespace PR12564 {
  struct Base {
    void bar(Base&) {}
    void bar(Base&) {} // unexpected-note {{here}}
  };

  struct Derived : Base {
    void foo(Derived& d) noexcept(noexcept(d.bar(d))) {}
    // FIXME: This should be accepted.
    void foo(Derived& d) noexcept(noexcept(d.bar(d))) {} // unexpected-error {{cannot bind to a value of unrelated type}}
  };
}
+1 −2
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ struct array
{
    T data[N];

  void swap(array& a) noexcept(noexcept(::swap(declval<T&>(), declval<T&>())));
    void swap(array& a) noexcept(noexcept(swap(declval<T&>(), declval<T&>())));
};

struct DefaultOnly
@@ -38,4 +38,3 @@ int main()
{
    array<DefaultOnly, 1> a, b;
}
+5 −2
Original line number Diff line number Diff line
@@ -40,9 +40,12 @@ namespace InClassInitializers {
}

namespace ExceptionSpecification {
  struct Nested {
  // A type is permitted to be used in a dynamic exception specification when it
  // is still being defined, but isn't complete within such an exception
  // specification.
  struct Nested { // expected-note {{not complete}}
    struct T {
      T() noexcept(!noexcept(Nested())); // expected-error{{exception specification is not available until end of class definition}}
      T() noexcept(!noexcept(Nested())); // expected-error{{incomplete type}}
    } t;
  };
}