]> granicus.if.org Git - clang/commitdiff
Revert small change to EmitDeclRefLValue
authorRenato Golin <renato.golin@linaro.org>
Tue, 27 May 2014 16:46:27 +0000 (16:46 +0000)
committerRenato Golin <renato.golin@linaro.org>
Tue, 27 May 2014 16:46:27 +0000 (16:46 +0000)
That small change, although it looked harmless, it made emitting the LValue
on the PHI node without the proper cast. Reverting it fixes PR19841.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209663 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExpr.cpp
test/CodeGen/pr19841.cpp [new file with mode: 0644]

index ba0e468c23d2d51fa775a55d72a2ede2f72ecf76..966edc46f2e5e6bd80e7646b9aaad6d0232096f0 100644 (file)
@@ -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/test/CodeGen/pr19841.cpp b/test/CodeGen/pr19841.cpp
new file mode 100644 (file)
index 0000000..4350625
--- /dev/null
@@ -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 };
+}