]> granicus.if.org Git - clang/commitdiff
When determining whether we need to instantiate a function type,
authorDouglas Gregor <dgregor@apple.com>
Mon, 9 May 2011 20:45:16 +0000 (20:45 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 9 May 2011 20:45:16 +0000 (20:45 +0000)
also consider whether any of the parameter types (as written, prior to
decay) are dependent. Fixes PR9880 and <rdar://problem/9408413>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@131099 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaTemplateInstantiate.cpp
test/SemaTemplate/instantiate-function-1.cpp

index 03c2befbc560b5c6753f5d6e4bb7b430249454af..564f099ad9fb7d1ed3f147454ca1504de57ceadf 100644 (file)
@@ -1388,6 +1388,12 @@ static bool NeedsInstantiationAsFunctionType(TypeSourceInfo *T) {
   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.
index 688d0095267ad0b77825cdc67e6ea512f05777e3..5406fbcd1baf7da8a6611b1cae0dbfc28029a7a9 100644 (file)
@@ -225,3 +225,25 @@ namespace PR7016 {
   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;
+}