[cfe-commits] r66997 - in /cfe/trunk: lib/AST/Expr.cpp lib/Sema/SemaDeclCXX.cpp test/SemaCXX/static-assert.cpp
Anders Carlsson
andersca at mac.com
Fri Mar 13 17:33:21 PDT 2009
Author: andersca
Date: Fri Mar 13 19:33:21 2009
New Revision: 66997
URL: http://llvm.org/viewvc/llvm-project?rev=66997&view=rev
Log:
Handle dependent types/exprs in static_assert expressions.
Modified:
cfe/trunk/lib/AST/Expr.cpp
cfe/trunk/lib/Sema/SemaDeclCXX.cpp
cfe/trunk/test/SemaCXX/static-assert.cpp
Modified: cfe/trunk/lib/AST/Expr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=66997&r1=66996&r2=66997&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Expr.cpp (original)
+++ cfe/trunk/lib/AST/Expr.cpp Fri Mar 13 19:33:21 2009
@@ -1044,6 +1044,7 @@
}
static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
+ assert(!E->isValueDependent() && "Should not see value dependent exprs!");
if (!E->getType()->isIntegralType()) {
return ICEDiag(2, E->getLocStart());
}
Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=66997&r1=66996&r2=66997&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Fri Mar 13 19:33:21 2009
@@ -2243,20 +2243,23 @@
StringLiteral *AssertMessage =
cast<StringLiteral>((Expr *)assertmessageexpr.get());
- llvm::APSInt Value(32);
- if (!AssertExpr->isIntegerConstantExpr(Value, Context)) {
- Diag(AssertLoc, diag::err_static_assert_expression_is_not_constant) <<
- AssertExpr->getSourceRange();
- return 0;
- }
+ if (!AssertExpr->isTypeDependent() && !AssertExpr->isValueDependent()) {
+ llvm::APSInt Value(32);
+ if (!AssertExpr->isIntegerConstantExpr(Value, Context)) {
+ Diag(AssertLoc, diag::err_static_assert_expression_is_not_constant) <<
+ AssertExpr->getSourceRange();
+ return 0;
+ }
+ if (Value == 0) {
+ std::string str(AssertMessage->getStrData(),
+ AssertMessage->getByteLength());
+ Diag(AssertLoc, diag::err_static_assert_failed) << str;
+ }
+ }
+
Decl *Decl = StaticAssertDecl::Create(Context, CurContext, AssertLoc,
AssertExpr, AssertMessage);
- if (Value == 0) {
- std::string str(AssertMessage->getStrData(),
- AssertMessage->getByteLength());
- Diag(AssertLoc, diag::err_static_assert_failed) << str;
- }
CurContext->addDecl(Decl);
return Decl;
Modified: cfe/trunk/test/SemaCXX/static-assert.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/static-assert.cpp?rev=66997&r1=66996&r2=66997&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/static-assert.cpp (original)
+++ cfe/trunk/test/SemaCXX/static-assert.cpp Fri Mar 13 19:33:21 2009
@@ -13,3 +13,12 @@
class C {
static_assert(false, "false is false"); // expected-error {{static_assert failed "false is false"}}
};
+
+template<int N> struct T {
+ static_assert(N == 2, "N is not 2!");
+};
+
+template<typename T> struct S {
+ static_assert(sizeof(T) > sizeof(char), "Type not big enough!");
+};
+
More information about the cfe-commits
mailing list