diff options
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 2 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/instantiate-try-catch.cpp | 14 | 
2 files changed, 15 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index d968bc6b75a..78123015a37 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -2553,7 +2553,7 @@ VarDecl *Sema::BuildExceptionDeclaration(Scope *S, QualType ExDeclType,    // The exception-declaration shall not denote a pointer or reference to an    // incomplete type, other than [cv] void*.    // N2844 forbids rvalue references. -  if(ExDeclType->isRValueReferenceType()) { +  if(!ExDeclType->isDependentType() && ExDeclType->isRValueReferenceType()) {      Diag(Loc, diag::err_catch_rvalue_ref) << Range;      Invalid = true;    } diff --git a/clang/test/SemaTemplate/instantiate-try-catch.cpp b/clang/test/SemaTemplate/instantiate-try-catch.cpp new file mode 100644 index 00000000000..074afa9d173 --- /dev/null +++ b/clang/test/SemaTemplate/instantiate-try-catch.cpp @@ -0,0 +1,14 @@ +// RUN: clang-cc -fsyntax-only -std=c++0x -verify %s + +template<typename T> struct TryCatch0 { +  void f() { +    try { +    } catch (T&&) { // expected-error 2{{cannot catch exceptions by rvalue reference}} +    } +  } +}; + +template struct TryCatch0<int&>; // okay +template struct TryCatch0<int&&>; // expected-note{{instantiation}} +template struct TryCatch0<int>; // expected-note{{instantiation}} +  | 

