From: Eli Friedman Date: Tue, 11 Jun 2013 22:26:34 +0000 (+0000) Subject: Tweak r183791 so we don't print a note without a source location. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=81359b0a88510087a873de771f9a2f5ee7ed97d9;p=clang Tweak r183791 so we don't print a note without a source location. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@183803 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 4d6eaa45c4..427f8f4110 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -2102,7 +2102,7 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, for (unsigned i = 0, e = StrLen; i != e; ++i) { llvm::APInt CodeUnit(PromotedCharTyWidth, SL->getCodeUnit(i)); Expr *Init = new (Context) IntegerLiteral( - Context, CodeUnit, PromotedCharTy, SourceLocation()); + Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc()); if (CharTy != PromotedCharTy) Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast, Init, 0, VK_RValue); @@ -2124,7 +2124,7 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, for (unsigned i = 0, e = StrLen; i != e; ++i) { llvm::APInt CodeUnit(PromotedCharTyWidth, Str[i]); Expr *Init = new (Context) IntegerLiteral( - Context, CodeUnit, PromotedCharTy, SourceLocation()); + Context, CodeUnit, PromotedCharTy, SubExpr->getExprLoc()); if (CharTy != PromotedCharTy) Init = ImplicitCastExpr::Create(Context, CharTy, CK_IntegralCast, Init, 0, VK_RValue); diff --git a/test/Sema/designated-initializers.c b/test/Sema/designated-initializers.c index c9a8482e85..36fa559f6f 100644 --- a/test/Sema/designated-initializers.c +++ b/test/Sema/designated-initializers.c @@ -277,3 +277,19 @@ struct ds ds2 = { { { .a = 0, .b = 1 // expected-error{{field designator 'b' does not refer to any field}} } } }; + +// Check initializer override warnings overriding a character in a string +struct overwrite_string_struct { + char L[6]; + int M; +} overwrite_string[] = { + { { "foo" }, 1 }, // expected-note {{previous initialization is here}} + [0].L[2] = 'x' // expected-warning{{initializer overrides prior initialization of this subobject}} +}; +struct overwrite_string_struct2 { + char L[6]; + int M; +} overwrite_string2[] = { + { { "foo" }, 1 }, + [0].L[4] = 'x' // no-warning + };