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

Merging r155424:

------------------------------------------------------------------------
r155424 | rsmith | 2012-04-23 22:06:35 -0700 (Mon, 23 Apr 2012) | 3 lines

PR12629: Cope with parenthesized function types when attaching a delayed
exception specification to a function.

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

llvm-svn: 156679
parent 1dfc8e93
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -11279,11 +11279,9 @@ void Sema::actOnDelayedExceptionSpecification(Decl *MethodD,
  if (!Method)
    return;
  
  // Dig out the prototype. This should never fail.
  // Dig out the prototype, looking through only parens. This should never fail.
  const FunctionProtoType *Proto
    = dyn_cast<FunctionProtoType>(Method->getType());
  if (!Proto)
    return;
    = cast<FunctionProtoType>(Method->getType().IgnoreParens());
  
  // Check the exception specification.
  llvm::SmallVector<QualType, 4> Exceptions;
@@ -11296,6 +11294,12 @@ void Sema::actOnDelayedExceptionSpecification(Decl *MethodD,
                                       Proto->arg_type_begin(),
                                       Proto->getNumArgs(),
                                       EPI);

  // Rebuild any parens around the function type.
  for (const ParenType *PT = dyn_cast<ParenType>(Method->getType()); PT;
       PT = dyn_cast<ParenType>(PT->getInnerType()))
    T = Context.getParenType(T);

  if (TypeSourceInfo *TSInfo = Method->getTypeSourceInfo()) {
    // FIXME: When we get proper type location information for exceptions,
    // we'll also have to rebuild the TypeSourceInfo. For now, we just patch
+10 −1
Original line number Diff line number Diff line
// RUN: %clang_cc1 -fsyntax-only -verify %s 
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s

// C++11 [class.mem]p2:
//   A class is considered a completely-defined object type (or
@@ -56,3 +56,12 @@ namespace test3 {

  template struct A2<int>;
}

namespace PR12629 {
  struct S {
    static int (f)() throw();
    static int ((((((g))))() throw(int)));
  };
  static_assert(noexcept(S::f()), "");
  static_assert(!noexcept(S::g()), "");
}