summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2012-11-07 21:17:13 +0000
committerRichard Trieu <rtrieu@google.com>2012-11-07 21:17:13 +0000
commit23bafad985291c0563cf2cb291f0d0747553fcde (patch)
tree8d705c7bcb90f67ad79698ebdece326895135b08 /clang
parent7778d616e8de90173324dc630109db6d28e48ba9 (diff)
downloadbcm5719-llvm-23bafad985291c0563cf2cb291f0d0747553fcde.tar.gz
bcm5719-llvm-23bafad985291c0563cf2cb291f0d0747553fcde.zip
When template deduction fails on a derived class, try a template deduction on
the base class. If the base class deduction succeeds, use those results. If it fails, keep using the results from the derived class template deduction. This prevents an assertion later where the type of deduction failure doesn't match up with the template deduction info. llvm-svn: 167550
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaTemplateDeduction.cpp7
-rw-r--r--clang/test/SemaTemplate/derived.cpp12
2 files changed, 18 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 98e22c0b65e..bf4533d6998 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -1393,9 +1393,11 @@ DeduceTemplateArgumentsByTypeMatch(Sema &S,
// If this is a base class, try to perform template argument
// deduction from it.
if (NextT != RecordT) {
+ TemplateDeductionInfo BaseInfo(Info.getLocation());
Sema::TemplateDeductionResult BaseResult
= DeduceTemplateArguments(S, TemplateParams, SpecParam,
- QualType(NextT, 0), Info, Deduced);
+ QualType(NextT, 0), BaseInfo,
+ Deduced);
// If template argument deduction for this base was successful,
// note that we had some success. Otherwise, ignore any deductions
@@ -1404,6 +1406,9 @@ DeduceTemplateArgumentsByTypeMatch(Sema &S,
Successful = true;
DeducedOrig.clear();
DeducedOrig.append(Deduced.begin(), Deduced.end());
+ Info.Param = BaseInfo.Param;
+ Info.FirstArg = BaseInfo.FirstArg;
+ Info.SecondArg = BaseInfo.SecondArg;
}
else
Deduced = DeducedOrig;
diff --git a/clang/test/SemaTemplate/derived.cpp b/clang/test/SemaTemplate/derived.cpp
new file mode 100644
index 00000000000..1fb9401c94c
--- /dev/null
+++ b/clang/test/SemaTemplate/derived.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+template<typename T> class vector2 {};
+template<typename T> class vector : vector2<T> {};
+
+template<typename T> void Foo2(vector2<const T*> V) {} // expected-note{{candidate template ignored: can't deduce a type for 'T' which would make 'const T' equal 'int'}}
+template<typename T> void Foo(vector<const T*> V) {} // expected-note {{candidate template ignored: can't deduce a type for 'T' which would make 'const T' equal 'int'}}
+
+void test() {
+ Foo2(vector2<int*>()); // expected-error{{no matching function for call to 'Foo2'}}
+ Foo(vector<int*>()); // expected-error{{no matching function for call to 'Foo'}}
+}
OpenPOWER on IntegriCloud