Provide a proper source location when building an implicit dereference. Fixes PR3600
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64993 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index f2c7de2..27e7db0 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -3705,7 +3705,7 @@
if (MemExpr->isArrow())
ObjectArg = new (Context) UnaryOperator(ObjectArg, UnaryOperator::Deref,
ObjectArg->getType()->getAsPointerType()->getPointeeType(),
- SourceLocation());
+ ObjectArg->getLocStart());
CXXMethodDecl *Method = 0;
if (OverloadedFunctionDecl *Ovl
= dyn_cast<OverloadedFunctionDecl>(MemExpr->getMemberDecl())) {
diff --git a/test/SemaCXX/copy-initialization.cpp b/test/SemaCXX/copy-initialization.cpp
index e380cc1..a56a886 100644
--- a/test/SemaCXX/copy-initialization.cpp
+++ b/test/SemaCXX/copy-initialization.cpp
@@ -1,5 +1,4 @@
// RUN: clang -fsyntax-only -verify %s
-
class X {
public:
explicit X(const X&);
@@ -15,3 +14,10 @@
X x3 = ip;
X x4 = fp; // expected-error{{cannot initialize 'x4' with an lvalue of type 'float *'}}
}
+
+struct foo {
+ void bar();
+};
+
+// PR3600
+void test(const foo *P) { P->bar(); } // expected-error{{cannot initialize object parameter of type 'struct foo' with an expression of type 'struct foo const'}}
diff --git a/test/SemaTemplate/class-template-spec.cpp b/test/SemaTemplate/class-template-spec.cpp
index db67598..9347bf5 100644
--- a/test/SemaTemplate/class-template-spec.cpp
+++ b/test/SemaTemplate/class-template-spec.cpp
@@ -29,3 +29,14 @@
template<> class A<FLOAT, float> { }; // expected-error{{redefinition}}
template<> class A<float, int> { }; // expected-error{{redefinition}}
+
+template<typename T, typename U = int> class X;
+
+template <> class X<int, int> { int foo(); }; // #1
+template <> class X<float> { int bar(); }; // #2
+
+typedef int int_type;
+void testme(X<int_type> *x1, X<float, int> *x2) {
+ x1->foo(); // okay: refers to #1
+ x2->bar(); // okay: refers to #2
+}