[cfe-commits] r131099 - in /cfe/trunk: lib/Sema/SemaTemplateInstantiate.cpp test/SemaTemplate/instantiate-function-1.cpp

Douglas Gregor dgregor at apple.com
Mon May 9 13:45:16 PDT 2011


Author: dgregor
Date: Mon May  9 15:45:16 2011
New Revision: 131099

URL: http://llvm.org/viewvc/llvm-project?rev=131099&view=rev
Log:
When determining whether we need to instantiate a function type,
also consider whether any of the parameter types (as written, prior to
decay) are dependent. Fixes PR9880 and <rdar://problem/9408413>.

Modified:
    cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
    cfe/trunk/test/SemaTemplate/instantiate-function-1.cpp

Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp?rev=131099&r1=131098&r2=131099&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp Mon May  9 15:45:16 2011
@@ -1388,6 +1388,12 @@
   for (unsigned I = 0, E = FP.getNumArgs(); I != E; ++I) {
     ParmVarDecl *P = FP.getArg(I);
 
+    // The parameter's type as written might be dependent even if the
+    // decayed type was not dependent.
+    if (TypeSourceInfo *TSInfo = P->getTypeSourceInfo())
+      if (TSInfo->getType()->isDependentType())
+        return true;
+
     // TODO: currently we always rebuild expressions.  When we
     // properly get lazier about this, we should use the same
     // logic to avoid rebuilding prototypes here.

Modified: cfe/trunk/test/SemaTemplate/instantiate-function-1.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-function-1.cpp?rev=131099&r1=131098&r2=131099&view=diff
==============================================================================
--- cfe/trunk/test/SemaTemplate/instantiate-function-1.cpp (original)
+++ cfe/trunk/test/SemaTemplate/instantiate-function-1.cpp Mon May  9 15:45:16 2011
@@ -225,3 +225,25 @@
   template<typename T> void f() { T x = x; }
   template void f<int>();
 }
+
+namespace PR9880 {
+  struct lua_State;
+  struct no_tag { char a; };			// (A)
+  struct yes_tag { long a; long b; };	// (A)
+
+  template <typename T>
+  struct HasIndexMetamethod {
+    template <typename U>
+    static no_tag check(...);
+    template <typename U>
+    static yes_tag check(char[sizeof(&U::luaIndex)]);
+    enum { value = sizeof(check<T>(0)) == sizeof(yes_tag) };
+  };
+  
+  class SomeClass {
+  public:
+    int luaIndex(lua_State* L);
+  };
+  
+  int i = HasIndexMetamethod<SomeClass>::value;
+}





More information about the cfe-commits mailing list