]> granicus.if.org Git - clang/commitdiff
Fix http://llvm.org/PR7660
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Mon, 19 Jul 2010 10:14:41 +0000 (10:14 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Mon, 19 Jul 2010 10:14:41 +0000 (10:14 +0000)
A ParmVarDecl instantiated from a FunctionProtoType may have Record as DeclContext,
in which case isStaticDataMember() will erroneously return true.

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

include/clang/AST/Decl.h
lib/Sema/SemaTemplateInstantiate.cpp
test/PCH/cxx-templates.h

index 7fbf874e8e5db409a21c4eebc47d3cad488e5167..737eeff2a1c327df466a29fab74c2fa60a65409c 100644 (file)
@@ -696,7 +696,7 @@ public:
   /// \endcode
   bool isStaticDataMember() const {
     // If it wasn't static, it would be a FieldDecl.
-    return getDeclContext()->isRecord();
+    return getKind() != Decl::ParmVar && getDeclContext()->isRecord();
   }
 
   virtual VarDecl *getCanonicalDecl();
index 0cdc8a12ab73c6f4c92ec605dcccdaec1ea47d7c..da99c7e8c2c9b542193735bc1a84c1950fd1360d 100644 (file)
@@ -1067,7 +1067,8 @@ ParmVarDecl *Sema::SubstParmVarDecl(ParmVarDecl *OldParm,
   NewParm->setHasInheritedDefaultArg(OldParm->hasInheritedDefaultArg());
 
   CurrentInstantiationScope->InstantiatedLocal(OldParm, NewParm);
-  // Set DeclContext if inside a Block.
+  // FIXME: OldParm may come from a FunctionProtoType, in which case CurContext
+  // can be anything, is this right ?
   NewParm->setDeclContext(CurContext);
   
   return NewParm;  
index 396853686faddf0a7b4f2238f4a5c64a1f0aac2d..8cffa3f10da649b732a997f59c098b04a79c05b3 100644 (file)
@@ -100,3 +100,6 @@ class basic_streambuf
   friend int __copy_streambufs_eof<>(int);
 };
 
+// PR 7660
+template<typename T> struct S_PR7660 { void g(void (*)(T)); };
+ template<> void S_PR7660<int>::g(void(*)(int)) {}