]> granicus.if.org Git - clang/commitdiff
Fix crash-on-invalid: only use TransformAddressOfOperand when transforming the
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 21 May 2013 23:29:46 +0000 (23:29 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 21 May 2013 23:29:46 +0000 (23:29 +0000)
operand of a unary address-of expression, not for *all* expressions!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@182436 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/SemaTemplate/instantiate-expr-5.cpp

index 95ea9bc4ecd187a72b5b97c50b0ced1fd4622576..7f3a7d7540a48874f6c05a6399c72f7757f6f619 100644 (file)
@@ -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();
 
index 13b7eae21fd4822418f6a189594ca5f75dc6418c..c42c2a964dc275440dbc4651c94b21c70663064f 100644 (file)
@@ -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}}
+}