diff options
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 6 | ||||
-rw-r--r-- | clang/test/SemaTemplate/instantiate-expr-5.cpp | 10 |
2 files changed, 15 insertions, 1 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 95ea9bc4ecd..7f3a7d7540a 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -6320,7 +6320,11 @@ TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { template<typename Derived> ExprResult TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { - ExprResult SubExpr = TransformAddressOfOperand(E->getSubExpr()); + ExprResult SubExpr; + if (E->getOpcode() == UO_AddrOf) + SubExpr = TransformAddressOfOperand(E->getSubExpr()); + else + SubExpr = TransformExpr(E->getSubExpr()); if (SubExpr.isInvalid()) return ExprError(); diff --git a/clang/test/SemaTemplate/instantiate-expr-5.cpp b/clang/test/SemaTemplate/instantiate-expr-5.cpp index 13b7eae21fd..c42c2a964dc 100644 --- a/clang/test/SemaTemplate/instantiate-expr-5.cpp +++ b/clang/test/SemaTemplate/instantiate-expr-5.cpp @@ -36,3 +36,13 @@ namespace PR5880 { template void test_anon_union<int>(); } + +namespace AddrOfClassMember { + template <typename T> struct S { + int n; + static void f() { + +T::n; // expected-error {{invalid use of member}} + } + }; + void g() { S<S<int> >::f(); } // expected-note {{in instantiation of}} +} |