diff --git a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp index 3e68373028b10..0058a0ddfb0df 100644 --- a/clang/lib/StaticAnalyzer/Core/MemRegion.cpp +++ b/clang/lib/StaticAnalyzer/Core/MemRegion.cpp @@ -1219,6 +1219,16 @@ MemRegionManager::getElementRegion(QualType elementType, NonLoc Idx, const ASTContext &Ctx) { QualType T = Ctx.getCanonicalType(elementType).getUnqualifiedType(); + // The address space must be preserved because some target-specific address + // spaces influence the size of the pointer value which is represented by the + // element region. + LangAS AS = elementType.getAddressSpace(); + if (AS != LangAS::Default) { + Qualifiers Quals; + Quals.setAddressSpace(AS); + T = Ctx.getQualifiedType(T, Quals); + } + llvm::FoldingSetNodeID ID; ElementRegion::ProfileRegion(ID, T, Idx, superRegion); diff --git a/clang/test/Analysis/element-region-address-space.c b/clang/test/Analysis/element-region-address-space.c new file mode 100644 index 0000000000000..dd7066240fef6 --- /dev/null +++ b/clang/test/Analysis/element-region-address-space.c @@ -0,0 +1,11 @@ +// RUN: %clang_analyze_cc1 -triple amdgcn-unknown-unknown \ +// RUN: -analyzer-checker=core -verify %s + +// expected-no-diagnostics +// +// By default, pointers are 64-bits. +#define ADDRESS_SPACE_32BITS __attribute__((address_space(3))) + +int test(ADDRESS_SPACE_32BITS int *p, ADDRESS_SPACE_32BITS void *q) { + return p == q; // no-crash +}