diff options
| -rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 17 | ||||
| -rw-r--r-- | clang/test/CodeGen/pr19841.cpp | 28 |
2 files changed, 36 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index ba0e468c23d..966edc46f2e 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1798,16 +1798,15 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) { const NamedDecl *ND = E->getDecl(); CharUnits Alignment = getContext().getDeclAlign(ND); QualType T = E->getType(); - const auto *VD = dyn_cast<VarDecl>(ND); - // Global Named registers access via intrinsics only - if (VD && VD->getStorageClass() == SC_Register && - VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl()) - return EmitGlobalNamedRegister(VD, CGM, Alignment); + if (const auto *VD = dyn_cast<VarDecl>(ND)) { + // Global Named registers access via intrinsics only + if (VD->getStorageClass() == SC_Register && + VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl()) + return EmitGlobalNamedRegister(VD, CGM, Alignment); - // A DeclRefExpr for a reference initialized by a constant expression can - // appear without being odr-used. Directly emit the constant initializer. - if (VD) { + // A DeclRefExpr for a reference initialized by a constant expression can + // appear without being odr-used. Directly emit the constant initializer. const Expr *Init = VD->getAnyInitializer(VD); if (Init && !isa<ParmVarDecl>(VD) && VD->getType()->isReferenceType() && VD->isUsableInConstantExpressions(getContext()) && @@ -1833,7 +1832,7 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) { return MakeAddrLValue(Aliasee, T, Alignment); } - if (VD) { + if (const auto *VD = dyn_cast<VarDecl>(ND)) { // Check if this is a global variable. if (VD->hasLinkage() || VD->isStaticDataMember()) return EmitGlobalVarDeclLValue(*this, E, VD); diff --git a/clang/test/CodeGen/pr19841.cpp b/clang/test/CodeGen/pr19841.cpp new file mode 100644 index 00000000000..4350625d182 --- /dev/null +++ b/clang/test/CodeGen/pr19841.cpp @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s + +namespace Common { +enum RenderMode { + kRenderEGA, + kRenderCGA +}; +class C; +class A { + A(); + C *_vm; + unsigned char _highlightColorTableVGA[]; + static const unsigned char b[]; +}; +class B { +public: + Common::RenderMode _configRenderMode; +}; +class C : public B {}; +A::A() { + 0 == Common::kRenderCGA || _vm->_configRenderMode == Common::kRenderEGA + ? b + : _highlightColorTableVGA; +// Make sure the PHI value is casted correctly to the PHI type +// CHECK: %cond-lvalue = phi [0 x i8]* [ bitcast ([1 x i8]* @_ZN6Common1A1bE to [0 x i8]*), %cond.true ], [ %_highlightColorTableVGA, %cond.false ] +} +const unsigned char A::b[] = { 0 }; +} |

