diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-11-09 23:03:14 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-11-09 23:03:14 +0000 |
commit | a67d503aa19700ff849fc590039b6bb8ced4ebf0 (patch) | |
tree | 55f2b0309bec82bf1b496d6ed9153ec157309ffa | |
parent | 6af1405ad2b30422bedee4dbe116fd693aeeeed8 (diff) | |
download | clang-a67d503aa19700ff849fc590039b6bb8ced4ebf0.tar.gz clang-a67d503aa19700ff849fc590039b6bb8ced4ebf0.tar.bz2 clang-a67d503aa19700ff849fc590039b6bb8ced4ebf0.tar.xz |
PR13788: Don't perform checks on the initializer of a dependently-typed
variable. Previously we didn't notice the type was dependent if the only
dependence came from an array bound.
Patch by Brian Brooks!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@167642 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 7 | ||||
-rw-r--r-- | test/SemaTemplate/dependent-sized_array.cpp | 11 |
2 files changed, 14 insertions, 4 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 628d2245a8..0092d5dab1 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -7219,8 +7219,8 @@ void Sema::CheckCompleteVariableDeclaration(VarDecl *var) { // All the following checks are C++ only. if (!getLangOpts().CPlusPlus) return; - QualType baseType = Context.getBaseElementType(var->getType()); - if (baseType->isDependentType()) return; + QualType type = var->getType(); + if (type->isDependentType()) return; // __block variables might require us to capture a copy-initializer. if (var->hasAttr<BlocksAttr>()) { @@ -7229,8 +7229,6 @@ void Sema::CheckCompleteVariableDeclaration(VarDecl *var) { // Regardless, we don't want to ignore array nesting when // constructing this copy. - QualType type = var->getType(); - if (type->isStructureOrClassType()) { SourceLocation poi = var->getLocation(); Expr *varRef =new (Context) DeclRefExpr(var, false, type, VK_LValue, poi); @@ -7248,6 +7246,7 @@ void Sema::CheckCompleteVariableDeclaration(VarDecl *var) { Expr *Init = var->getInit(); bool IsGlobal = var->hasGlobalStorage() && !var->isStaticLocal(); + QualType baseType = Context.getBaseElementType(type); if (!var->getDeclContext()->isDependentContext() && Init && !Init->isValueDependent()) { diff --git a/test/SemaTemplate/dependent-sized_array.cpp b/test/SemaTemplate/dependent-sized_array.cpp index cf0e0f37ee..6fdcaa63e5 100644 --- a/test/SemaTemplate/dependent-sized_array.cpp +++ b/test/SemaTemplate/dependent-sized_array.cpp @@ -15,3 +15,14 @@ void f1() { int a1[] = { 1, 2, 3, N }; int a3[sizeof(a1)/sizeof(int) != 4? 1 : -1]; // expected-error{{negative}} } + +namespace PR13788 { + template <unsigned __N> + struct S { + int V; + }; + template <int N> + void foo() { + S<0> arr[N] = {{ 4 }}; + } +} |