diff options
-rw-r--r-- | lib/Sema/TreeTransform.h | 10 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-declref.cpp | 10 |
2 files changed, 16 insertions, 4 deletions
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 2f8d075c2a..fc6c7f08e0 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -4214,10 +4214,12 @@ TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { if (!ND) return SemaRef.ExprError(); - DeclarationNameInfo NameInfo - = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); - if (!NameInfo.getName()) - return SemaRef.ExprError(); + DeclarationNameInfo NameInfo = E->getNameInfo(); + if (NameInfo.getName()) { + NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); + if (!NameInfo.getName()) + return SemaRef.ExprError(); + } if (!getDerived().AlwaysRebuild() && Qualifier == E->getQualifier() && diff --git a/test/SemaTemplate/instantiate-declref.cpp b/test/SemaTemplate/instantiate-declref.cpp index 2d27075bd4..ced56dfc6a 100644 --- a/test/SemaTemplate/instantiate-declref.cpp +++ b/test/SemaTemplate/instantiate-declref.cpp @@ -95,3 +95,13 @@ namespace test0 { }; void g() { X<2>(); } } + +// <rdar://problem/8302161> +namespace test1 { + template <typename T> void f(T const &t) { + union { char c; T t_; }; + c = 'a'; // <- this shouldn't silently fail to instantiate + T::foo(); // expected-error {{has no members}} + } + template void f(int const &); // expected-note {{requested here}} +} |