r202147 - Sema: When merging objc string literals, give the result a constant array type.
Benjamin Kramer
benny.kra at googlemail.com
Tue Feb 25 04:26:20 PST 2014
Author: d0k
Date: Tue Feb 25 06:26:20 2014
New Revision: 202147
URL: http://llvm.org/viewvc/llvm-project?rev=202147&view=rev
Log:
Sema: When merging objc string literals, give the result a constant array type.
Also assert that we never create non-array string literals again.
PR18939.
Modified:
cfe/trunk/lib/AST/Expr.cpp
cfe/trunk/lib/Sema/SemaExprObjC.cpp
cfe/trunk/test/SemaObjC/format-strings-objc.m
Modified: cfe/trunk/lib/AST/Expr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=202147&r1=202146&r2=202147&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Expr.cpp (original)
+++ cfe/trunk/lib/AST/Expr.cpp Tue Feb 25 06:26:20 2014
@@ -781,6 +781,9 @@ StringLiteral *StringLiteral::Create(con
StringKind Kind, bool Pascal, QualType Ty,
const SourceLocation *Loc,
unsigned NumStrs) {
+ assert(C.getAsConstantArrayType(Ty) &&
+ "StringLiteral must be of constant array type!");
+
// Allocate enough space for the StringLiteral plus an array of locations for
// any concatenated string tokens.
void *Mem = C.Allocate(sizeof(StringLiteral)+
Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=202147&r1=202146&r2=202147&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Tue Feb 25 06:26:20 2014
@@ -67,10 +67,14 @@ ExprResult Sema::ParseObjCStringLiteral(
// Create the aggregate string with the appropriate content and location
// information.
- S = StringLiteral::Create(Context, StrBuf,
- StringLiteral::Ascii, /*Pascal=*/false,
- Context.getPointerType(Context.CharTy),
- &StrLocs[0], StrLocs.size());
+ const ConstantArrayType *CAT = Context.getAsConstantArrayType(S->getType());
+ assert(CAT && "String literal not of constant array type!");
+ QualType StrTy = Context.getConstantArrayType(
+ CAT->getElementType(), llvm::APInt(32, StrBuf.size() + 1),
+ CAT->getSizeModifier(), CAT->getIndexTypeCVRQualifiers());
+ S = StringLiteral::Create(Context, StrBuf, StringLiteral::Ascii,
+ /*Pascal=*/false, StrTy, &StrLocs[0],
+ StrLocs.size());
}
return BuildObjCStringLiteral(AtLocs[0], S);
Modified: cfe/trunk/test/SemaObjC/format-strings-objc.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/format-strings-objc.m?rev=202147&r1=202146&r2=202147&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/format-strings-objc.m (original)
+++ cfe/trunk/test/SemaObjC/format-strings-objc.m Tue Feb 25 06:26:20 2014
@@ -116,6 +116,9 @@ NSString *test_literal_propagation(void)
NSLog(ns2); // expected-warning {{more '%' conversions than data arguments}}
NSString * ns3 = ns1;
NSLog(ns3); // expected-warning {{format string is not a string literal}}}
+
+ NSString * const ns6 = @"split" " string " @"%s"; // expected-note {{format string is defined here}}
+ NSLog(ns6); // expected-warning {{more '%' conversions than data arguments}}
}
// Do not emit warnings when using NSLocalizedString
More information about the cfe-commits
mailing list