Merge commit '1db40ee0042d3ff4ca47ec282fadf5870268e397' into HEAD

This commit is contained in:
dotnet-bot 2016-02-16 05:45:12 -08:00
Родитель 11db0fc320 1db40ee004
Коммит 2d5ab8398c
12 изменённых файлов: 237 добавлений и 42 удалений

Просмотреть файл

@ -6187,7 +6187,8 @@ bool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) {
/// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way /// EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way
/// as GCC. /// as GCC.
static int EvaluateBuiltinClassifyType(const CallExpr *E) { static int EvaluateBuiltinClassifyType(const CallExpr *E,
const LangOptions &LangOpts) {
// The following enum mimics the values returned by GCC. // The following enum mimics the values returned by GCC.
// FIXME: Does GCC differ between lvalue and rvalue references here? // FIXME: Does GCC differ between lvalue and rvalue references here?
enum gcc_type_class { enum gcc_type_class {
@ -6207,36 +6208,131 @@ static int EvaluateBuiltinClassifyType(const CallExpr *E) {
if (E->getNumArgs() == 0) if (E->getNumArgs() == 0)
return no_type_class; return no_type_class;
QualType ArgTy = E->getArg(0)->getType(); QualType CanTy = E->getArg(0)->getType().getCanonicalType();
if (ArgTy->isVoidType()) const BuiltinType *BT = dyn_cast<BuiltinType>(CanTy);
switch (CanTy->getTypeClass()) {
#define TYPE(ID, BASE)
#define DEPENDENT_TYPE(ID, BASE) case Type::ID:
#define NON_CANONICAL_TYPE(ID, BASE) case Type::ID:
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(ID, BASE) case Type::ID:
#include "clang/AST/TypeNodes.def"
llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type");
case Type::Builtin:
switch (BT->getKind()) {
#define BUILTIN_TYPE(ID, SINGLETON_ID)
#define SIGNED_TYPE(ID, SINGLETON_ID) case BuiltinType::ID: return integer_type_class;
#define FLOATING_TYPE(ID, SINGLETON_ID) case BuiltinType::ID: return real_type_class;
#define PLACEHOLDER_TYPE(ID, SINGLETON_ID) case BuiltinType::ID: break;
#include "clang/AST/BuiltinTypes.def"
case BuiltinType::Void:
return void_type_class; return void_type_class;
else if (ArgTy->isEnumeralType())
return enumeral_type_class; case BuiltinType::Bool:
else if (ArgTy->isBooleanType())
return boolean_type_class; return boolean_type_class;
else if (ArgTy->isCharType())
return string_type_class; // gcc doesn't appear to use char_type_class case BuiltinType::Char_U: // gcc doesn't appear to use char_type_class
else if (ArgTy->isIntegerType()) case BuiltinType::UChar:
case BuiltinType::UShort:
case BuiltinType::UInt:
case BuiltinType::ULong:
case BuiltinType::ULongLong:
case BuiltinType::UInt128:
return integer_type_class; return integer_type_class;
else if (ArgTy->isPointerType())
case BuiltinType::NullPtr:
return pointer_type_class; return pointer_type_class;
else if (ArgTy->isReferenceType())
return reference_type_class; case BuiltinType::WChar_U:
else if (ArgTy->isRealType()) case BuiltinType::Char16:
return real_type_class; case BuiltinType::Char32:
else if (ArgTy->isComplexType()) case BuiltinType::ObjCId:
case BuiltinType::ObjCClass:
case BuiltinType::ObjCSel:
case BuiltinType::OCLImage1d:
case BuiltinType::OCLImage1dArray:
case BuiltinType::OCLImage2d:
case BuiltinType::OCLImage2dArray:
case BuiltinType::OCLImage1dBuffer:
case BuiltinType::OCLImage2dDepth:
case BuiltinType::OCLImage2dArrayDepth:
case BuiltinType::OCLImage2dMSAA:
case BuiltinType::OCLImage2dArrayMSAA:
case BuiltinType::OCLImage2dMSAADepth:
case BuiltinType::OCLImage2dArrayMSAADepth:
case BuiltinType::OCLImage3d:
case BuiltinType::OCLSampler:
case BuiltinType::OCLEvent:
case BuiltinType::OCLClkEvent:
case BuiltinType::OCLQueue:
case BuiltinType::OCLNDRange:
case BuiltinType::OCLReserveID:
case BuiltinType::Dependent:
llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type");
};
case Type::Enum:
return LangOpts.CPlusPlus ? enumeral_type_class : integer_type_class;
break;
case Type::Pointer:
return pointer_type_class;
break;
case Type::MemberPointer:
if (CanTy->isMemberDataPointerType())
return offset_type_class;
else {
// We expect member pointers to be either data or function pointers,
// nothing else.
assert(CanTy->isMemberFunctionPointerType());
return method_type_class;
}
case Type::Complex:
return complex_type_class; return complex_type_class;
else if (ArgTy->isFunctionType())
return function_type_class; case Type::FunctionNoProto:
else if (ArgTy->isStructureOrClassType()) case Type::FunctionProto:
return LangOpts.CPlusPlus ? function_type_class : pointer_type_class;
case Type::Record:
if (const RecordType *RT = CanTy->getAs<RecordType>()) {
switch (RT->getDecl()->getTagKind()) {
case TagTypeKind::TTK_Struct:
case TagTypeKind::TTK_Class:
case TagTypeKind::TTK_Interface:
return record_type_class; return record_type_class;
else if (ArgTy->isUnionType())
case TagTypeKind::TTK_Enum:
return LangOpts.CPlusPlus ? enumeral_type_class : integer_type_class;
case TagTypeKind::TTK_Union:
return union_type_class; return union_type_class;
else if (ArgTy->isArrayType()) }
return array_type_class; }
else if (ArgTy->isUnionType()) llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type");
return union_type_class;
else // FIXME: offset_type_class, method_type_class, & lang_type_class? case Type::ConstantArray:
case Type::VariableArray:
case Type::IncompleteArray:
return LangOpts.CPlusPlus ? array_type_class : pointer_type_class;
case Type::BlockPointer:
case Type::LValueReference:
case Type::RValueReference:
case Type::Vector:
case Type::ExtVector:
case Type::Auto:
case Type::ObjCObject:
case Type::ObjCInterface:
case Type::ObjCObjectPointer:
case Type::Pipe:
case Type::Atomic:
llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type");
}
llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type"); llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type");
} }
@ -6609,7 +6705,7 @@ bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
} }
case Builtin::BI__builtin_classify_type: case Builtin::BI__builtin_classify_type:
return Success(EvaluateBuiltinClassifyType(E), E); return Success(EvaluateBuiltinClassifyType(E, Info.getLangOpts()), E);
// FIXME: BI__builtin_clrsb // FIXME: BI__builtin_clrsb
// FIXME: BI__builtin_clrsbl // FIXME: BI__builtin_clrsbl

Просмотреть файл

@ -1060,7 +1060,7 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
} }
if (!Args.getLastArg(options::OPT_stdlib_EQ) && if (!Args.getLastArg(options::OPT_stdlib_EQ) &&
GetDefaultCXXStdlibType() == ToolChain::CST_Libcxx) GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ), DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
"libc++"); "libc++");

Просмотреть файл

@ -559,7 +559,10 @@ bool WrapperFrontendAction::BeginSourceFileAction(CompilerInstance &CI,
StringRef Filename) { StringRef Filename) {
WrappedAction->setCurrentInput(getCurrentInput()); WrappedAction->setCurrentInput(getCurrentInput());
WrappedAction->setCompilerInstance(&CI); WrappedAction->setCompilerInstance(&CI);
return WrappedAction->BeginSourceFileAction(CI, Filename); auto Ret = WrappedAction->BeginSourceFileAction(CI, Filename);
// BeginSourceFileAction may change CurrentInput, e.g. during module builds.
setCurrentInput(WrappedAction->getCurrentInput());
return Ret;
} }
void WrapperFrontendAction::ExecuteAction() { void WrapperFrontendAction::ExecuteAction() {
WrappedAction->ExecuteAction(); WrappedAction->ExecuteAction();

Просмотреть файл

@ -1226,7 +1226,7 @@ void Preprocessor::HandleUserDiagnosticDirective(Token &Tok,
// Find the first non-whitespace character, so that we can make the // Find the first non-whitespace character, so that we can make the
// diagnostic more succinct. // diagnostic more succinct.
StringRef Msg = StringRef(Message).ltrim(" "); StringRef Msg = StringRef(Message).ltrim(' ');
if (isWarning) if (isWarning)
Diag(Tok, diag::pp_hash_warning) << Msg; Diag(Tok, diag::pp_hash_warning) << Msg;

Просмотреть файл

@ -1000,7 +1000,7 @@ void EmptyLocalizationContextChecker::MethodCrawler::VisitObjCMessageExpr(
return; return;
StringRef Comment = StringRef Comment =
StringRef(Result.getLiteralData(), Result.getLength()).trim("\""); StringRef(Result.getLiteralData(), Result.getLength()).trim('"');
if ((Comment.trim().size() == 0 && Comment.size() > 0) || // Is Whitespace if ((Comment.trim().size() == 0 && Comment.size() > 0) || // Is Whitespace
Comment.empty()) { Comment.empty()) {

Просмотреть файл

@ -75,7 +75,7 @@ void MacOSXAPIChecker::CheckDispatchOnce(CheckerContext &C, const CallExpr *CE,
// _dispatch_once is then a function which then calls the real dispatch_once. // _dispatch_once is then a function which then calls the real dispatch_once.
// Users do not care; they just want the warning at the top-level call. // Users do not care; they just want the warning at the top-level call.
if (CE->getLocStart().isMacroID()) { if (CE->getLocStart().isMacroID()) {
StringRef TrimmedFName = FName.ltrim("_"); StringRef TrimmedFName = FName.ltrim('_');
if (TrimmedFName != FName) if (TrimmedFName != FName)
FName = TrimmedFName; FName = TrimmedFName;
} }

Просмотреть файл

@ -24,7 +24,7 @@
// CHECK-X86_64-HIDDEN: @"OBJC_CLASS_$_MySecretNamespace.A" = hidden global {{.*}}, section "__DATA, __objc_data", align 8 // CHECK-X86_64-HIDDEN: @"OBJC_CLASS_$_MySecretNamespace.A" = hidden global {{.*}}, section "__DATA, __objc_data", align 8
// CHECK-X86_64-HIDDEN: @"OBJC_METACLASS_$_MySecretNamespace.A" = hidden global {{.*}}, section "__DATA, __objc_data", align 8 // CHECK-X86_64-HIDDEN: @"OBJC_METACLASS_$_MySecretNamespace.A" = hidden global {{.*}}, section "__DATA, __objc_data", align 8
// CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_MySecretNamespace.EH1" = weak hidden global {{.*}} // CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_MySecretNamespace.EH1" = weak hidden global
// CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_MySecretNamespace.EH2" = external global // CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_MySecretNamespace.EH2" = external global
// CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_MySecretNamespace.EH3" = hidden global {{.*}}, section "__DATA,__objc_const", align 8 // CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_MySecretNamespace.EH3" = hidden global {{.*}}, section "__DATA,__objc_const", align 8
// CHECK-X86_64-HIDDEN: define internal void @"\01-[A im0]" // CHECK-X86_64-HIDDEN: define internal void @"\01-[A im0]"

Просмотреть файл

@ -23,7 +23,7 @@
// CHECK-X86_64-HIDDEN: @"OBJC_CLASS_$_A" = hidden global {{.*}}, section "__DATA, __objc_data", align 8 // CHECK-X86_64-HIDDEN: @"OBJC_CLASS_$_A" = hidden global {{.*}}, section "__DATA, __objc_data", align 8
// CHECK-X86_64-HIDDEN: @"OBJC_METACLASS_$_A" = hidden global {{.*}}, section "__DATA, __objc_data", align 8 // CHECK-X86_64-HIDDEN: @"OBJC_METACLASS_$_A" = hidden global {{.*}}, section "__DATA, __objc_data", align 8
// CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_EH1" = weak hidden global {{.*}} // CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_EH1" = weak hidden global
// CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_EH2" = external global // CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_EH2" = external global
// CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_EH3" = hidden global {{.*}}, section "__DATA,__objc_const", align 8 // CHECK-X86_64-HIDDEN: @"OBJC_EHTYPE_$_EH3" = hidden global {{.*}}, section "__DATA,__objc_const", align 8
// CHECK-X86_64-HIDDEN: define internal void @"\01-[A im0]" // CHECK-X86_64-HIDDEN: define internal void @"\01-[A im0]"

Просмотреть файл

Просмотреть файл

@ -10,16 +10,16 @@
// RUN: touch %T/ps4-ld.exe // RUN: touch %T/ps4-ld.exe
// RUN: touch %T/ps4-ld.gold.exe // RUN: touch %T/ps4-ld.gold.exe
// RUN: env "PATH=%T;%PATH%" %clang -target x86_64-scei-ps4 %s -fuse-ld=gold -### 2>&1 \ // RUN: env "PATH=%T;%PATH%;" %clang -target x86_64-scei-ps4 %s -fuse-ld=gold -### 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-PS4-GOLD %s // RUN: | FileCheck --check-prefix=CHECK-PS4-GOLD %s
// RUN: env "PATH=%T;%PATH%" %clang -target x86_64-scei-ps4 %s -shared -### 2>&1 \ // RUN: env "PATH=%T;%PATH%;" %clang -target x86_64-scei-ps4 %s -shared -### 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-PS4-GOLD %s // RUN: | FileCheck --check-prefix=CHECK-PS4-GOLD %s
// RUN: env "PATH=%T;%PATH%" %clang -target x86_64-scei-ps4 %s -### 2>&1 \ // RUN: env "PATH=%T;%PATH%;" %clang -target x86_64-scei-ps4 %s -### 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-PS4-LINKER %s // RUN: | FileCheck --check-prefix=CHECK-PS4-LINKER %s
// RUN: env "PATH=%T;%PATH%" %clang -target x86_64-scei-ps4 %s -fuse-ld=ps4 -### 2>&1 \ // RUN: env "PATH=%T;%PATH%;" %clang -target x86_64-scei-ps4 %s -fuse-ld=ps4 -### 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-PS4-LINKER %s // RUN: | FileCheck --check-prefix=CHECK-PS4-LINKER %s
// RUN: env "PATH=%T;%PATH%" %clang -target x86_64-scei-ps4 %s -shared \ // RUN: env "PATH=%T;%PATH%;" %clang -target x86_64-scei-ps4 %s -shared \
// RUN: -fuse-ld=ps4 -### 2>&1 | FileCheck --check-prefix=CHECK-PS4-LINKER %s // RUN: -fuse-ld=ps4 -### 2>&1 | FileCheck --check-prefix=CHECK-PS4-LINKER %s
// FIXME: "Output\\" is hardcoded part of %T. // FIXME: "Output\\" is hardcoded part of %T.

Просмотреть файл

@ -0,0 +1,42 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
// expected-no-diagnostics
enum gcc_type_class {
no_type_class = -1,
void_type_class, integer_type_class, char_type_class,
enumeral_type_class, boolean_type_class,
pointer_type_class, reference_type_class, offset_type_class,
real_type_class, complex_type_class,
function_type_class, method_type_class,
record_type_class, union_type_class,
array_type_class, string_type_class,
lang_type_class
};
void foo() {
int i;
char c;
enum { red, green, blue } enum_obj;
int *p;
double d;
_Complex double cc;
extern void f();
struct { int a; float b; } s_obj;
union { int a; float b; } u_obj;
int arr[10];
int a1[__builtin_classify_type(f()) == void_type_class ? 1 : -1];
int a2[__builtin_classify_type(i) == integer_type_class ? 1 : -1];
int a3[__builtin_classify_type(c) == integer_type_class ? 1 : -1];
int a4[__builtin_classify_type(enum_obj) == integer_type_class ? 1 : -1];
int a5[__builtin_classify_type(p) == pointer_type_class ? 1 : -1];
int a6[__builtin_classify_type(d) == real_type_class ? 1 : -1];
int a7[__builtin_classify_type(cc) == complex_type_class ? 1 : -1];
int a8[__builtin_classify_type(f) == pointer_type_class ? 1 : -1];
int a0[__builtin_classify_type(s_obj) == record_type_class ? 1 : -1];
int a10[__builtin_classify_type(u_obj) == union_type_class ? 1 : -1];
int a11[__builtin_classify_type(arr) == pointer_type_class ? 1 : -1];
int a12[__builtin_classify_type("abc") == pointer_type_class ? 1 : -1];
}

Просмотреть файл

@ -0,0 +1,54 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
// expected-no-diagnostics
enum gcc_type_class {
no_type_class = -1,
void_type_class, integer_type_class, char_type_class,
enumeral_type_class, boolean_type_class,
pointer_type_class, reference_type_class, offset_type_class,
real_type_class, complex_type_class,
function_type_class, method_type_class,
record_type_class, union_type_class,
array_type_class, string_type_class,
lang_type_class
};
class cl {
public:
void bar() {}
int baz;
};
int builtin_result;
void foo() {
int i;
char c;
enum { red, green, blue} enum_obj;
bool b;
int *p;
int &r = i;
double d;
extern void f();
cl cl_obj;
union { int a; float b; } u_obj;
int arr[10];
int a1[__builtin_classify_type(f()) == void_type_class ? 1 : -1];
int a2[__builtin_classify_type(i) == integer_type_class ? 1 : -1];
int a3[__builtin_classify_type(c) == integer_type_class ? 1 : -1];
int a4[__builtin_classify_type(enum_obj) == enumeral_type_class ? 1 : -1];
int a5[__builtin_classify_type(b) == boolean_type_class ? 1 : -1];
int a6[__builtin_classify_type(p) == pointer_type_class ? 1 : -1];
int a7[__builtin_classify_type(r) == integer_type_class ? 1 : -1];
int a8[__builtin_classify_type(&cl::baz) == offset_type_class ? 1 : -1];
int a9[__builtin_classify_type(d) == real_type_class ? 1 : -1];
int a10[__builtin_classify_type(f) == function_type_class ? 1 : -1];
int a11[__builtin_classify_type(&cl::bar) == method_type_class ? 1 : -1];
int a12[__builtin_classify_type(cl_obj) == record_type_class ? 1 : -1];
int a13[__builtin_classify_type(u_obj) == union_type_class ? 1 : -1];
int a14[__builtin_classify_type(arr) == array_type_class ? 1 : -1];
int a15[__builtin_classify_type("abc") == array_type_class ? 1 : -1];
}