diff options
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 7 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-field.cpp | 12 |
2 files changed, 19 insertions, 0 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 24ce72032c..24dcfb62a1 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -2643,6 +2643,13 @@ bool AnalyzeBitFieldAssignment(Sema &S, FieldDecl *Bitfield, Expr *Init, if (Bitfield->getType()->isBooleanType()) return false; + // Ignore value- or type-dependent expressions. + if (Bitfield->getBitWidth()->isValueDependent() || + Bitfield->getBitWidth()->isTypeDependent() || + Init->isValueDependent() || + Init->isTypeDependent()) + return false; + Expr *OriginalInit = Init->IgnoreParenImpCasts(); llvm::APSInt Width(32); diff --git a/test/SemaTemplate/instantiate-field.cpp b/test/SemaTemplate/instantiate-field.cpp index d825cd7cc6..a148ee4e55 100644 --- a/test/SemaTemplate/instantiate-field.cpp +++ b/test/SemaTemplate/instantiate-field.cpp @@ -90,3 +90,15 @@ namespace PR7355 { A<int> ai; // expected-note{{in instantiation of}} } + +namespace PR8712 { + template <int dim> + class B { + public: + B(const unsigned char i); + unsigned char value : (dim > 0 ? dim : 1); + }; + + template <int dim> + inline B<dim>::B(const unsigned char i) : value(i) {} +} |