diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -931,6 +931,14 @@ GV.setDSOLocal(true); } +static std::string typeComparisonErrorMessage(StringRef Message, Type *Ty1, + Type *Ty2) { + std::string ErrString; + raw_string_ostream ErrOS(ErrString); + ErrOS << Message << " (" << *Ty1 << " vs " << *Ty2 << ")"; + return ErrOS.str(); +} + /// parseIndirectSymbol: /// ::= GlobalVar '=' OptionalLinkage OptionalPreemptionSpecifier /// OptionalVisibility OptionalDLLStorageClass @@ -998,13 +1006,18 @@ return error(AliaseeLoc, "An alias or ifunc must have pointer type"); unsigned AddrSpace = PTy->getAddressSpace(); - if (IsAlias && Ty != PTy->getElementType()) - return error(ExplicitTypeLoc, - "explicit pointee type doesn't match operand's pointee type"); + if (IsAlias && Ty != PTy->getElementType()) { + return error( + ExplicitTypeLoc, + typeComparisonErrorMessage( + "explicit pointee type doesn't match operand's pointee type", Ty, + PTy->getElementType())); + } - if (!IsAlias && !PTy->getElementType()->isFunctionTy()) + if (!IsAlias && !PTy->getElementType()->isFunctionTy()) { return error(ExplicitTypeLoc, "explicit pointee type should be a function type"); + } GlobalValue *GVal = nullptr; @@ -3844,10 +3857,13 @@ Type *BaseType = Elts[0]->getType(); auto *BasePointerType = cast(BaseType->getScalarType()); - if (Ty != BasePointerType->getElementType()) + if (Ty != BasePointerType->getElementType()) { return error( ExplicitTypeLoc, - "explicit pointee type doesn't match operand's pointee type"); + typeComparisonErrorMessage( + "explicit pointee type doesn't match operand's pointee type", + Ty, BasePointerType->getElementType())); + } unsigned GEPWidth = BaseType->isVectorTy() @@ -7454,9 +7470,13 @@ Ordering == AtomicOrdering::AcquireRelease) return error(Loc, "atomic load cannot use Release ordering"); - if (Ty != cast(Val->getType())->getElementType()) - return error(ExplicitTypeLoc, - "explicit pointee type doesn't match operand's pointee type"); + if (Ty != cast(Val->getType())->getElementType()) { + return error( + ExplicitTypeLoc, + typeComparisonErrorMessage( + "explicit pointee type doesn't match operand's pointee type", Ty, + cast(Val->getType())->getElementType())); + } SmallPtrSet Visited; if (!Alignment && !Ty->isSized(&Visited)) return error(ExplicitTypeLoc, "loading unsized types is not allowed"); @@ -7710,9 +7730,13 @@ if (!BasePointerType) return error(Loc, "base of getelementptr must be a pointer"); - if (Ty != BasePointerType->getElementType()) - return error(ExplicitTypeLoc, - "explicit pointee type doesn't match operand's pointee type"); + if (Ty != BasePointerType->getElementType()) { + return error( + ExplicitTypeLoc, + typeComparisonErrorMessage( + "explicit pointee type doesn't match operand's pointee type", Ty, + BasePointerType->getElementType())); + } SmallVector Indices; bool AteExtraComma = false; diff --git a/llvm/test/Assembler/invalid-alias-mismatched-explicit-type.ll b/llvm/test/Assembler/invalid-alias-mismatched-explicit-type.ll --- a/llvm/test/Assembler/invalid-alias-mismatched-explicit-type.ll +++ b/llvm/test/Assembler/invalid-alias-mismatched-explicit-type.ll @@ -1,4 +1,4 @@ ; RUN: not llvm-as < %s 2>&1 | FileCheck %s -; CHECK: :4:12: error: explicit pointee type doesn't match operand's pointee type +; CHECK: :4:12: error: explicit pointee type doesn't match operand's pointee type (i1 vs i2) @y = global i2 0 @x = alias i1, i2* @y diff --git a/llvm/test/Assembler/invalid-gep-mismatched-explicit-type.ll b/llvm/test/Assembler/invalid-gep-mismatched-explicit-type.ll --- a/llvm/test/Assembler/invalid-gep-mismatched-explicit-type.ll +++ b/llvm/test/Assembler/invalid-gep-mismatched-explicit-type.ll @@ -1,6 +1,6 @@ -; RUN: not llvm-as < %s 2>&1 | FileCheck %s -; CHECK: :4:22: error: explicit pointee type doesn't match operand's pointee type -define void @test(i32* %t) { - %x = getelementptr i16, i32* %t, i32 0 - ret void -} +; RUN: not llvm-as < %s 2>&1 | FileCheck %s +; CHECK: :4:22: error: explicit pointee type doesn't match operand's pointee type (i16 vs i32) +define void @test(i32* %t) { + %x = getelementptr i16, i32* %t, i32 0 + ret void +} diff --git a/llvm/test/Assembler/invalid-load-mismatched-explicit-type.ll b/llvm/test/Assembler/invalid-load-mismatched-explicit-type.ll --- a/llvm/test/Assembler/invalid-load-mismatched-explicit-type.ll +++ b/llvm/test/Assembler/invalid-load-mismatched-explicit-type.ll @@ -1,6 +1,6 @@ -; RUN: not llvm-as < %s 2>&1 | FileCheck %s -; CHECK: :4:13: error: explicit pointee type doesn't match operand's pointee type -define void @test(i32* %t) { - %x = load i16, i32* %t - ret void -} +; RUN: not llvm-as < %s 2>&1 | FileCheck %s +; CHECK: :4:13: error: explicit pointee type doesn't match operand's pointee type (i16 vs i32) +define void @test(i32* %t) { + %x = load i16, i32* %t + ret void +}