diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/Type.cpp | 8 | ||||
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 8 |
2 files changed, 12 insertions, 4 deletions
diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index ca10532e72..8e6aa23618 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -678,7 +678,11 @@ bool Type::isIncompleteType() const { /// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10) bool Type::isPODType() const { // The compiler shouldn't query this for incomplete types, but the user might. - // We return false for that case. + // We return false for that case. Except for incomplete arrays of PODs, which + // are PODs according to the standard. + if (isIncompleteArrayType() && + cast<ArrayType>(CanonicalType)->getElementType()->isPODType()) + return true; if (isIncompleteType()) return false; @@ -687,7 +691,7 @@ bool Type::isPODType() const { default: return false; case VariableArray: case ConstantArray: - // IncompleteArray is caught by isIncompleteType() above. + // IncompleteArray is handled above. return cast<ArrayType>(CanonicalType)->getElementType()->isPODType(); case Builtin: diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index de9b599907..7857ea9693 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -1956,9 +1956,13 @@ ExprResult Sema::ActOnUnaryTypeTrait(UnaryTypeTrait OTT, // According to http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html // all traits except __is_class, __is_enum and __is_union require a the type - // to be complete. + // to be complete, an array of unknown bound, or void. if (OTT != UTT_IsClass && OTT != UTT_IsEnum && OTT != UTT_IsUnion) { - if (RequireCompleteType(KWLoc, T, + QualType E = T; + if (T->isIncompleteArrayType()) + E = Context.getAsArrayType(T)->getElementType(); + if (!T->isVoidType() && + RequireCompleteType(KWLoc, E, diag::err_incomplete_type_used_in_type_trait_expr)) return ExprError(); } |