diff options
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | 7 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/instantiate-expr-3.cpp | 29 | 
2 files changed, 36 insertions, 0 deletions
| diff --git a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp index e5ad0cd3042..9dda383342c 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -50,6 +50,7 @@ namespace {      // FIXME: VisitMemberExpr      // FIXME: CompoundLiteralExpr      OwningExprResult VisitBinaryOperator(BinaryOperator *E); +    OwningExprResult VisitCompoundAssignOperator(CompoundAssignOperator *E);      OwningExprResult VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);      OwningExprResult VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E);      OwningExprResult VisitConditionalOperator(ConditionalOperator *E); @@ -284,6 +285,12 @@ TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {  }  Sema::OwningExprResult  +TemplateExprInstantiator::VisitCompoundAssignOperator( +                                                 CompoundAssignOperator *E) { +  return VisitBinaryOperator(E); +} + +Sema::OwningExprResult   TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {    Sema::OwningExprResult First = Visit(E->getArg(0));    if (First.isInvalid()) diff --git a/clang/test/SemaTemplate/instantiate-expr-3.cpp b/clang/test/SemaTemplate/instantiate-expr-3.cpp index cf6139d0cec..892f649ef7a 100644 --- a/clang/test/SemaTemplate/instantiate-expr-3.cpp +++ b/clang/test/SemaTemplate/instantiate-expr-3.cpp @@ -9,3 +9,32 @@ struct ImaginaryLiteral0 {  template struct ImaginaryLiteral0<_Complex float>;  template struct ImaginaryLiteral0<int*>; // expected-note{{instantiation}} + +namespace N1 { +  struct X { }; + +  int& operator+=(X&, int); // expected-note{{candidate}} +} + +namespace N2 { +  long& operator+=(N1::X&, long); // expected-note{{candidate}} + +  template<typename T, typename U, typename Result> +  struct PlusEquals0 { +    void f(T t, U u) { +      Result r = t += u; // expected-error{{ambiguous}} +    } +  }; +} + +namespace N3 { +  struct Y : public N1::X { +    short& operator+=(long); // expected-note{{candidate}} +  }; +} + +template struct N2::PlusEquals0<N1::X, int, int&>; +template struct N2::PlusEquals0<N1::X, long, long&>; +template struct N2::PlusEquals0<N3::Y, long, short&>; +template struct N2::PlusEquals0<int, int, int&>; +template struct N2::PlusEquals0<N3::Y, int, short&>; // expected-note{{instantiation}} | 

