Commit a58017e5 authored by Elizabeth Andrews's avatar Elizabeth Andrews
Browse files

Fix type-dependency of bitfields in templates

This patch is a follow up to 878a24ee. Name of bitfields
with value-dependent width should be set as type-dependent. This
patch adds the required value-dependency check and sets the
type-dependency accordingly.

Patch fixes PR44886

Differential revision: https://reviews.llvm.org/D72242
parent f8d044bb
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1680,6 +1680,11 @@ MemberExpr *MemberExpr::Create(
    CXXRecordDecl *RD = dyn_cast_or_null<CXXRecordDecl>(DC);
    if (RD && RD->isDependentContext() && RD->isCurrentInstantiation(DC))
      E->setTypeDependent(T->isDependentType());

    // Bitfield with value-dependent width is type-dependent.
    FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl);
    if (FD && FD->isBitField() && FD->getBitWidth()->isValueDependent())
      E->setTypeDependent(true);
  }

  if (HasQualOrFound) {
+2 −1
Original line number Diff line number Diff line
// RUN: %clang_cc1 -fsyntax-only -verify %s
// expected-no-diagnostics

enum Enum { val = 1 };
template <Enum v> struct C {
@@ -30,7 +31,7 @@ namespace rdar8020920 {
    unsigned long long bitfield : e0;

    void f(int j) {
      bitfield + j; // expected-warning {{expression result unused}}
      bitfield + j;
    }
  };
}
+13 −0
Original line number Diff line number Diff line
// RUN: %clang_cc1 -fsyntax-only -verify %s
// expected-no-diagnostics

template <int b>
class A {
  int c : b;

public:
  void f() {
    if (c)
      ;
  }
};