[cfe-commits] r167550 - in /cfe/trunk: lib/Sema/SemaTemplateDeduction.cpp test/SemaTemplate/derived.cpp

Richard Trieu rtrieu at google.com
Wed Nov 7 13:17:13 PST 2012


Author: rtrieu
Date: Wed Nov  7 15:17:13 2012
New Revision: 167550

URL: http://llvm.org/viewvc/llvm-project?rev=167550&view=rev
Log:
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.

Added:
    cfe/trunk/test/SemaTemplate/derived.cpp
Modified:
    cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp

Modified: cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp?rev=167550&r1=167549&r2=167550&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp Wed Nov  7 15:17:13 2012
@@ -1393,9 +1393,11 @@
             // 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 @@
                 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;

Added: cfe/trunk/test/SemaTemplate/derived.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/derived.cpp?rev=167550&view=auto
==============================================================================
--- cfe/trunk/test/SemaTemplate/derived.cpp (added)
+++ cfe/trunk/test/SemaTemplate/derived.cpp Wed Nov  7 15:17:13 2012
@@ -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'}}
+}





More information about the cfe-commits mailing list