]> granicus.if.org Git - clang/commitdiff
Fix assertion failure in TransformOpaqueValueExpr
authorHubert Tong <hubert.reinterpretcast@gmail.com>
Tue, 1 Sep 2015 22:50:31 +0000 (22:50 +0000)
committerHubert Tong <hubert.reinterpretcast@gmail.com>
Tue, 1 Sep 2015 22:50:31 +0000 (22:50 +0000)
Summary:
`OpaqueValueExpr`s may not have a source expression (as in the case when
they are created due to a default argument error).
This can cause an assertion failure in `TransformOpaqueValueExpr` during
template instantiation.

This patch fixes the assertion failure.

Reviewers: hfinkel, rsmith

Subscribers: fraggamuffin, cfe-commits

Differential Revision: http://reviews.llvm.org/D11582

Patch by Rachel Craik!

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

lib/Sema/TreeTransform.h
test/SemaTemplate/default-arguments.cpp

index 9074c39ad5db9eaca66f8ea3d9da211bd0b47458..692a2f1dcb4801ff8879c06e2e02b533c99383c6 100644 (file)
@@ -7806,7 +7806,7 @@ TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
 template<typename Derived>
 ExprResult
 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
-  assert(getDerived().AlreadyTransformed(E->getType()) &&
+  assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
          "opaque value expression requires transformation");
   return E;
 }
index 0e972522d40bc7e69555f44d1d087c639e97e080..37d144b7197195778fce288574f1c521c9dd0ee8 100644 (file)
@@ -166,3 +166,9 @@ namespace NondefDecls {
   }
   template void f1<int>();  // expected-note{{in instantiation of function template specialization 'NondefDecls::f1<int>' requested here}}
 }
+
+template <typename T>
+struct C {
+  C(T t = ); // expected-error {{expected expression}}
+};
+C<int> obj;