Author: Jameson Nash Date: 2026-02-13T13:18:23-05:00 New Revision: da5e298dcc1015f20ee5f6990bc88c372bd3a97f
URL: https://github.com/llvm/llvm-project/commit/da5e298dcc1015f20ee5f6990bc88c372bd3a97f DIFF: https://github.com/llvm/llvm-project/commit/da5e298dcc1015f20ee5f6990bc88c372bd3a97f.diff LOG: [Sema][NFC] simplify deduceOpenCLAddressSpace (#181253) All callers of deduceOpenCLAddressSpace passed some sort of VarDecl (such as a ParmVarDecl), so the dynamic cast and indentation was unnecessary. Added: Modified: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 9ae2fa52a441a..9424b80d5cdb6 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -4667,7 +4667,7 @@ class Sema final : public SemaBase { /// Look for a locally scoped extern "C" declaration by the given name. NamedDecl *findLocallyScopedExternCDecl(DeclarationName Name); - void deduceOpenCLAddressSpace(ValueDecl *decl); + void deduceOpenCLAddressSpace(VarDecl *decl); void deduceHLSLAddressSpace(VarDecl *decl); /// Adjust the \c DeclContext for a function or variable that might be a diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 7af6ce62d08dd..4dfde4bf8cedf 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7050,45 +7050,43 @@ static void SetNestedNameSpecifier(Sema &S, DeclaratorDecl *DD, Declarator &D) { DD->setQualifierInfo(SS.getWithLocInContext(S.Context)); } -void Sema::deduceOpenCLAddressSpace(ValueDecl *Decl) { - if (Decl->getType().hasAddressSpace()) +void Sema::deduceOpenCLAddressSpace(VarDecl *Var) { + QualType Type = Var->getType(); + if (Type.hasAddressSpace()) return; - if (Decl->getType()->isDependentType()) + if (Type->isDependentType()) return; - if (VarDecl *Var = dyn_cast<VarDecl>(Decl)) { - QualType Type = Var->getType(); - if (Type->isSamplerT() || Type->isVoidType()) - return; - LangAS ImplAS = LangAS::opencl_private; - // OpenCL C v3.0 s6.7.8 - For OpenCL C 2.0 or with the - // __opencl_c_program_scope_global_variables feature, the address space - // for a variable at program scope or a static or extern variable inside - // a function are inferred to be __global. - if (getOpenCLOptions().areProgramScopeVariablesSupported(getLangOpts()) && - Var->hasGlobalStorage()) - ImplAS = LangAS::opencl_global; - // If the original type from a decayed type is an array type and that array - // type has no address space yet, deduce it now. - if (auto DT = dyn_cast<DecayedType>(Type)) { - auto OrigTy = DT->getOriginalType(); - if (!OrigTy.hasAddressSpace() && OrigTy->isArrayType()) { - // Add the address space to the original array type and then propagate - // that to the element type through `getAsArrayType`. - OrigTy = Context.getAddrSpaceQualType(OrigTy, ImplAS); - OrigTy = QualType(Context.getAsArrayType(OrigTy), 0); - // Re-generate the decayed type. - Type = Context.getDecayedType(OrigTy); - } - } - Type = Context.getAddrSpaceQualType(Type, ImplAS); - // Apply any qualifiers (including address space) from the array type to - // the element type. This implements C99 6.7.3p8: "If the specification of - // an array type includes any type qualifiers, the element type is so - // qualified, not the array type." - if (Type->isArrayType()) - Type = QualType(Context.getAsArrayType(Type), 0); - Decl->setType(Type); - } + if (Type->isSamplerT() || Type->isVoidType()) + return; + LangAS ImplAS = LangAS::opencl_private; + // OpenCL C v3.0 s6.7.8 - For OpenCL C 2.0 or with the + // __opencl_c_program_scope_global_variables feature, the address space + // for a variable at program scope or a static or extern variable inside + // a function are inferred to be __global. + if (getOpenCLOptions().areProgramScopeVariablesSupported(getLangOpts()) && + Var->hasGlobalStorage()) + ImplAS = LangAS::opencl_global; + // If the original type from a decayed type is an array type and that array + // type has no address space yet, deduce it now. + if (auto DT = dyn_cast<DecayedType>(Type)) { + auto OrigTy = DT->getOriginalType(); + if (!OrigTy.hasAddressSpace() && OrigTy->isArrayType()) { + // Add the address space to the original array type and then propagate + // that to the element type through `getAsArrayType`. + OrigTy = Context.getAddrSpaceQualType(OrigTy, ImplAS); + OrigTy = QualType(Context.getAsArrayType(OrigTy), 0); + // Re-generate the decayed type. + Type = Context.getDecayedType(OrigTy); + } + } + Type = Context.getAddrSpaceQualType(Type, ImplAS); + // Apply any qualifiers (including address space) from the array type to + // the element type. This implements C99 6.7.3p8: "If the specification of + // an array type includes any type qualifiers, the element type is so + // qualified, not the array type." + if (Type->isArrayType()) + Type = QualType(Context.getAsArrayType(Type), 0); + Var->setType(Type); } static void checkWeakAttr(Sema &S, NamedDecl &ND) { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
