diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-11-16 19:13:03 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-11-16 19:13:03 +0000 |
commit | 1a3c75f32f0d27de5f3f6b2ef4c6bbe7e18bddad (patch) | |
tree | d76a86bd579f365af9b6d3e3071a5e98ac2a4f2a | |
parent | 1804463ee790ac3cc73f72597ccb38b983f7d263 (diff) |
Fix PR5488: special-case the overloaded arrow operator so that we don't try to
treat it as a unary operator.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@88938 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/TreeTransform.h | 3 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-overloaded-arrow.cpp | 20 |
2 files changed, 23 insertions, 0 deletions
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index e46f9c75d2..d3dab4b8e1 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -5390,6 +5390,9 @@ TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, return getSema().CreateBuiltinArraySubscriptExpr(move(First), DRE->getLocStart(), move(Second), OpLoc); + } else if (Op == OO_Arrow) { + // -> is never a builtin operation. + return SemaRef.BuildOverloadedArrowExpr(0, move(First), OpLoc); } else if (SecondExpr == 0 || isPostIncDec) { if (!FirstExpr->getType()->isOverloadableType()) { // The argument is not of overloadable type, so try to create a diff --git a/test/SemaTemplate/instantiate-overloaded-arrow.cpp b/test/SemaTemplate/instantiate-overloaded-arrow.cpp new file mode 100644 index 0000000000..7f0ef0c990 --- /dev/null +++ b/test/SemaTemplate/instantiate-overloaded-arrow.cpp @@ -0,0 +1,20 @@ +// RUN: clang-cc -fsyntax-only -verify %s +// PR5488 + +struct X { + int x; +}; + +struct Iter { + X* operator->(); +}; + +template <typename T> +void Foo() { + (void)Iter()->x; +} + +void Func() { + Foo<int>(); +} + |