diff options
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 4 | ||||
| -rw-r--r-- | clang/test/CXX/expr/expr.prim/expr.prim.lambda/p14.cpp | 12 | 
3 files changed, 18 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 88ced4c7edd..670ff9c918c 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -922,6 +922,8 @@ def err_allocation_of_abstract_type : Error<  def err_throw_abstract_type : Error<    "cannot throw an object of abstract type %0">;  def err_array_of_abstract_type : Error<"array of abstract class type %0">; +def err_capture_of_abstract_type : Error< +  "by-copy capture of value of abstract type %0">;  def err_multiple_final_overriders : Error<    "virtual function %q0 has more than one final overrider in %1">;  diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 690661df1c7..6bcc49ed623 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -11687,6 +11687,10 @@ static bool captureInLambda(LambdaScopeInfo *LSI,        }        return false;      } + +    if (S.RequireNonAbstractType(Loc, CaptureType, +                                 diag::err_capture_of_abstract_type)) +      return false;    }    // Capture this variable in the lambda. diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p14.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p14.cpp index 6358215a555..2ddcf18409e 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p14.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p14.cpp @@ -88,3 +88,15 @@ struct CaptureArrayAndThis {    }  }; +namespace rdar14468891 { +  class X { +  public: +    virtual ~X() = 0; // expected-note{{unimplemented pure virtual method '~X' in 'X'}} +  }; + +  class Y : public X { }; + +  void capture(X &x) { +    [x]() {}(); // expected-error{{by-copy capture of value of abstract type 'rdar14468891::X'}} +  } +}  | 

