[cfe-commits] r103624 - in /cfe/trunk: lib/Sema/SemaTemplateInstantiate.cpp lib/Sema/SemaTemplateInstantiateDecl.cpp test/SemaTemplate/instantiate-field.cpp

Douglas Gregor dgregor at apple.com
Wed May 12 10:27:19 PDT 2010


Author: dgregor
Date: Wed May 12 12:27:19 2010
New Revision: 103624

URL: http://llvm.org/viewvc/llvm-project?rev=103624&view=rev
Log:
Whenever we instantiate a function definition or class, enter a new
potentially-evaluated expression context, to ensure that used
declarations get properly marked. Fixes PR7123.

Modified:
    cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
    cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
    cfe/trunk/test/SemaTemplate/instantiate-field.cpp

Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp?rev=103624&r1=103623&r2=103624&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp Wed May 12 12:27:19 2010
@@ -1175,6 +1175,8 @@
   // Enter the scope of this instantiation. We don't use
   // PushDeclContext because we don't have a scope.
   ContextRAII SavedContext(*this, Instantiation);
+  EnterExpressionEvaluationContext EvalContext(*this, 
+                                               Action::PotentiallyEvaluated);
 
   // If this is an instantiation of a local class, merge this local
   // instantiation scope with the enclosing scope. Otherwise, every

Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=103624&r1=103623&r2=103624&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Wed May 12 12:27:19 2010
@@ -2011,6 +2011,8 @@
   if (Recursive)
     PendingImplicitInstantiations.swap(SavedPendingImplicitInstantiations);
 
+  EnterExpressionEvaluationContext EvalContext(*this, 
+                                               Action::PotentiallyEvaluated);
   ActOnStartOfFunctionDef(0, DeclPtrTy::make(Function));
 
   // Introduce a new scope where local variable instantiations will be

Modified: cfe/trunk/test/SemaTemplate/instantiate-field.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-field.cpp?rev=103624&r1=103623&r2=103624&view=diff
==============================================================================
--- cfe/trunk/test/SemaTemplate/instantiate-field.cpp (original)
+++ cfe/trunk/test/SemaTemplate/instantiate-field.cpp Wed May 12 12:27:19 2010
@@ -26,3 +26,58 @@
 void test3(const X<int(int)> *xf) {
   (void)xf->x; // expected-note{{in instantiation of template class 'X<int (int)>' requested here}}
 }
+
+namespace PR7123 {
+  template <class > struct requirement_;
+
+  template <void(*)()> struct instantiate
+  { };
+
+  template <class > struct requirement ;
+  struct failed ;
+
+  template <class Model> struct requirement<failed *Model::*>
+  {
+    static void failed()
+    {
+      ((Model*)0)->~Model(); // expected-note{{in instantiation of}}
+    }
+  };
+
+  template <class Model> struct requirement_<void(*)(Model)> : requirement<failed *Model::*>
+  { };
+
+  template <int> struct Requires_
+  { typedef void type; };
+
+  template <class Model> struct usage_requirements
+  {
+    ~usage_requirements()
+    {((Model*)0)->~Model(); } // expected-note{{in instantiation of}}
+  };
+
+  template < typename TT > struct BidirectionalIterator
+  {
+    enum
+      { value = 0 };
+  
+    instantiate< requirement_<void(*)(usage_requirements<BidirectionalIterator>)>::failed> int534; // expected-note{{in instantiation of}}
+  
+    ~BidirectionalIterator()
+    { i--; } // expected-error{{cannot decrement value of type 'PR7123::X'}}
+  
+    TT i;
+  };
+
+  struct X
+  { };
+
+  template<typename RanIter> 
+  typename Requires_< BidirectionalIterator<RanIter>::value >::type sort(RanIter,RanIter){}
+
+  void f()
+  {
+    X x;
+    sort(x,x);
+  }
+}





More information about the cfe-commits mailing list