Index: clang/include/clang/AST/Type.h =================================================================== --- clang/include/clang/AST/Type.h +++ clang/include/clang/AST/Type.h @@ -24,6 +24,7 @@ #include "clang/Basic/AttrKinds.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/ExceptionSpecificationType.h" +#include "clang/Basic/LangStandard.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/Linkage.h" #include "clang/Basic/PartialDiagnostic.h" @@ -3450,10 +3451,6 @@ protected: friend class ASTContext; - /// The element type of the matrix. - // FIXME: Appears to be unused? There is also MatrixType::ElementType... - QualType ElementType; - /// Number of rows and columns. unsigned NumRows; unsigned NumColumns; @@ -6989,9 +6986,8 @@ BT->getKind() <= BuiltinType::Int128; if (const EnumType *ET = dyn_cast(CanonicalType)) { // Incomplete enum types are not treated as integer types. - // FIXME: In C++, enum types are never integer types. - return IsEnumDeclComplete(ET->getDecl()) && - !IsEnumDeclScoped(ET->getDecl()); + // In C++, enum types are never integer types. + return !isCPlusPlus() && IsEnumDeclComplete(ET->getDecl()); } return isExtIntType(); } Index: clang/lib/AST/Type.cpp =================================================================== --- clang/lib/AST/Type.cpp +++ clang/lib/AST/Type.cpp @@ -31,6 +31,7 @@ #include "clang/Basic/AddressSpaces.h" #include "clang/Basic/ExceptionSpecificationType.h" #include "clang/Basic/IdentifierTable.h" +#include "clang/Basic/LangStandard.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/Linkage.h" @@ -2011,9 +2012,10 @@ if (const EnumType *ET = dyn_cast(CanonicalType)) { // Incomplete enum types are not treated as integer types. - // FIXME: In C++, enum types are never integer types. - if (ET->getDecl()->isComplete() && !ET->getDecl()->isScoped()) + // In C++, enum types are never integer types. + if (!isCPlusPlus() && ET->getDecl()->isComplete()) return ET->getDecl()->getIntegerType()->isSignedIntegerType(); + return false; } if (const ExtIntType *IT = dyn_cast(CanonicalType)) @@ -2058,9 +2060,10 @@ if (const auto *ET = dyn_cast(CanonicalType)) { // Incomplete enum types are not treated as integer types. - // FIXME: In C++, enum types are never integer types. - if (ET->getDecl()->isComplete() && !ET->getDecl()->isScoped()) + // In C++, enum types are never integer types. + if (!isCPlusPlus() && ET->getDecl()->isComplete()) return ET->getDecl()->getIntegerType()->isUnsignedIntegerType(); + return false; } if (const ExtIntType *IT = dyn_cast(CanonicalType)) @@ -2785,7 +2788,6 @@ case DependentTemplateSpecialization: case ObjCInterface: case ObjCObject: - case ObjCObjectPointer: // FIXME: object pointers aren't really specifiers return true; default: return false;