[cfe-commits] r141511 - in /cfe/trunk: lib/Sema/SemaTemplateInstantiateDecl.cpp test/CXX/except/except.spec/p1.cpp

Douglas Gregor dgregor at apple.com
Sun Oct 9 11:31:23 PDT 2011


Author: dgregor
Date: Sun Oct  9 13:31:23 2011
New Revision: 141511

URL: http://llvm.org/viewvc/llvm-project?rev=141511&view=rev
Log:
After instantiating a 'noexcept' expression, be	sure to	convert	it to
a boolean value and check that it is a constant expression. Fixes
PR11084.

Modified:
    cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
    cfe/trunk/test/CXX/except/except.spec/p1.cpp

Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=141511&r1=141510&r2=141511&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Sun Oct  9 13:31:23 2011
@@ -2286,7 +2286,21 @@
       EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
       ExprResult E = SemaRef.SubstExpr(OldNoexceptExpr, TemplateArgs);
       if (E.isUsable())
+        E = SemaRef.CheckBooleanCondition(E.get(), E.get()->getLocStart());
+    
+      if (E.isUsable()) {
+        SourceLocation ErrLoc;
+        llvm::APSInt NoexceptVal;
         NoexceptExpr = E.take();
+        if (!NoexceptExpr->isTypeDependent() &&
+            !NoexceptExpr->isValueDependent() &&
+            !NoexceptExpr->isIntegerConstantExpr(NoexceptVal, SemaRef.Context,
+                                                 &ErrLoc, /*evaluated=*/false)){
+          SemaRef.Diag(ErrLoc, diag::err_noexcept_needs_constant_expression)
+            << NoexceptExpr->getSourceRange();
+          NoexceptExpr = 0;
+        }
+      }
     }
 
     // Rebuild the function type

Modified: cfe/trunk/test/CXX/except/except.spec/p1.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/except/except.spec/p1.cpp?rev=141511&r1=141510&r2=141511&view=diff
==============================================================================
--- cfe/trunk/test/CXX/except/except.spec/p1.cpp (original)
+++ cfe/trunk/test/CXX/except/except.spec/p1.cpp Sun Oct  9 13:31:23 2011
@@ -60,14 +60,22 @@
 }
 
 namespace noexcept_unevaluated {
-  template<typename T> void f(T) {
+  template<typename T> bool f(T) {
     T* x = 1;
   }
 
   template<typename T>
-  void g(T x) noexcept((f(x), sizeof(T) == 4)) { }
+  void g(T x) noexcept((sizeof(T) == sizeof(int)) || f(x)) { }
 
   void h() {
     g(1);
   }
 }
+
+namespace PR11084 {
+  template<int X> struct A { 
+    static int f() noexcept(1/X) { return 10; }  // expected-error{{argument to noexcept specifier must be a constant expression}}
+  };
+
+  void g() { A<0>::f(); } // expected-note{{in instantiation of template class 'PR11084::A<0>' requested here}}
+}





More information about the cfe-commits mailing list