[cfe-commits] r130371 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaExprCXX.cpp
John Wiegley
johnw at boostpro.com
Wed Apr 27 19:06:46 PDT 2011
Author: johnw
Date: Wed Apr 27 21:06:46 2011
New Revision: 130371
URL: http://llvm.org/viewvc/llvm-project?rev=130371&view=rev
Log:
A few corrections to type traits that missed the last checkin
Modified:
cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
cfe/trunk/lib/Sema/SemaExprCXX.cpp
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=130371&r1=130370&r2=130371&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Apr 27 21:06:46 2011
@@ -3335,6 +3335,10 @@
def err_incomplete_type_used_in_type_trait_expr : Error<
"incomplete type %0 used in type trait expression">;
+def err_dependent_type_used_in_type_trait_expr : Error<
+ "dependent type %0 used in type trait expression">;
+def err_dimension_expr_not_constant_integer : Error<
+ "dimension expression does not evaluate to a constant unsigned int">;
def err_expected_ident_or_lparen : Error<"expected identifier or '('">;
def err_typecheck_cond_incompatible_operands_null : Error<
Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=130371&r1=130370&r2=130371&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Wed Apr 27 21:06:46 2011
@@ -2355,8 +2355,12 @@
SourceLocation KeyLoc) {
// FIXME: For many of these traits, we need a complete type before we can
// check these properties.
- assert(!T->isDependentType() &&
- "Cannot evaluate traits for dependent types.");
+
+ if (T->isDependentType()) {
+ Self.Diag(KeyLoc, diag::err_dependent_type_used_in_type_trait_expr) << T;
+ return false;
+ }
+
ASTContext &C = Self.Context;
switch(UTT) {
default: assert(false && "Unknown type trait or not implemented");
@@ -2653,7 +2657,16 @@
QualType E = T;
if (T->isIncompleteArrayType())
E = Context.getAsArrayType(T)->getElementType();
- if (!T->isVoidType() && ! LangOpts.Borland &&
+ if (!T->isVoidType() &&
+ (! LangOpts.Borland ||
+ UTT == UTT_HasNothrowAssign ||
+ UTT == UTT_HasNothrowCopy ||
+ UTT == UTT_HasNothrowConstructor ||
+ UTT == UTT_HasTrivialAssign ||
+ UTT == UTT_HasTrivialCopy ||
+ UTT == UTT_HasTrivialConstructor ||
+ UTT == UTT_HasTrivialDestructor ||
+ UTT == UTT_HasVirtualDestructor) &&
RequireCompleteType(KWLoc, E,
diag::err_incomplete_type_used_in_type_trait_expr))
return ExprError();
@@ -2688,8 +2701,14 @@
static bool EvaluateBinaryTypeTrait(Sema &Self, BinaryTypeTrait BTT,
QualType LhsT, QualType RhsT,
SourceLocation KeyLoc) {
- assert((!LhsT->isDependentType() || RhsT->isDependentType()) &&
- "Cannot evaluate traits for dependent types.");
+ if (LhsT->isDependentType()) {
+ Self.Diag(KeyLoc, diag::err_dependent_type_used_in_type_trait_expr) << LhsT;
+ return false;
+ }
+ else if (RhsT->isDependentType()) {
+ Self.Diag(KeyLoc, diag::err_dependent_type_used_in_type_trait_expr) << RhsT;
+ return false;
+ }
switch(BTT) {
case BTT_IsBaseOf: {
@@ -2828,8 +2847,10 @@
static uint64_t EvaluateArrayTypeTrait(Sema &Self, ArrayTypeTrait ATT,
QualType T, Expr *DimExpr,
SourceLocation KeyLoc) {
- assert((!T->isDependentType()) &&
- "Cannot evaluate traits for dependent types.");
+ if (T->isDependentType()) {
+ Self.Diag(KeyLoc, diag::err_dependent_type_used_in_type_trait_expr) << T;
+ return false;
+ }
switch(ATT) {
case ATT_ArrayRank:
@@ -2840,16 +2861,24 @@
T = AT->getElementType();
}
return Dim;
- } else {
- assert(! "Array type trait applied to non-array type");
}
+ return 0;
+
case ATT_ArrayExtent: {
llvm::APSInt Value;
uint64_t Dim;
- if (DimExpr->isIntegerConstantExpr(Value, Self.Context, 0, false))
+ if (DimExpr->isIntegerConstantExpr(Value, Self.Context, 0, false)) {
+ if (Value < llvm::APSInt(Value.getBitWidth(), Value.isUnsigned())) {
+ Self.Diag(KeyLoc, diag::err_dimension_expr_not_constant_integer) <<
+ DimExpr->getSourceRange();
+ return false;
+ }
Dim = Value.getLimitedValue();
- else
- assert(! "Dimension expression did not evaluate to a constant integer");
+ } else {
+ Self.Diag(KeyLoc, diag::err_dimension_expr_not_constant_integer) <<
+ DimExpr->getSourceRange();
+ return false;
+ }
if (T->isArrayType()) {
unsigned D = 0;
@@ -2863,14 +2892,12 @@
T = AT->getElementType();
}
- assert(Matched && T->isArrayType() &&
- "__array_extent does not refer to an array dimension");
-
- llvm::APInt size = Self.Context.getAsConstantArrayType(T)->getSize();
- return size.getLimitedValue();
- } else {
- assert(! "Array type trait applied to non-array type");
+ if (Matched && T->isArrayType()) {
+ if (const ConstantArrayType *CAT = Self.Context.getAsConstantArrayType(T))
+ return CAT->getSize().getLimitedValue();
+ }
}
+ return 0;
}
}
llvm_unreachable("Unknown type trait or not implemented");
More information about the cfe-commits
mailing list