summaryrefslogtreecommitdiffstats
path: root/clang/lib/Parse/ParseInit.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-10-26 23:29:41 +0000
committerChris Lattner <sabre@nondot.org>2008-10-26 23:29:41 +0000
commit9a53fdc23ecdd74ae801ffa4acbf6b548fb291d4 (patch)
treed110afa034a21fc346e6af035a9cf42b1473c7b1 /clang/lib/Parse/ParseInit.cpp
parent46dcba6d2d2ef444a7119a27943ec2988076796a (diff)
downloadbcm5719-llvm-9a53fdc23ecdd74ae801ffa4acbf6b548fb291d4.tar.gz
bcm5719-llvm-9a53fdc23ecdd74ae801ffa4acbf6b548fb291d4.zip
implement some more FIXMEs, by rejecting more bogus stuff in
objc mode. llvm-svn: 58216
Diffstat (limited to 'clang/lib/Parse/ParseInit.cpp')
-rw-r--r--clang/lib/Parse/ParseInit.cpp29
1 files changed, 25 insertions, 4 deletions
diff --git a/clang/lib/Parse/ParseInit.cpp b/clang/lib/Parse/ParseInit.cpp
index f4d18fbb4cf..655d8e75c72 100644
--- a/clang/lib/Parse/ParseInit.cpp
+++ b/clang/lib/Parse/ParseInit.cpp
@@ -121,8 +121,18 @@ ParseInitializerWithPotentialDesignator(InitListDesignations &Designations,
// If Objective-C is enabled and this is a typename or other identifier
// receiver, parse this as a message send expression.
if (getLang().ObjC1 && isTokObjCMessageIdentifierReceiver()) {
- // FIXME: Emit ext_gnu_missing_equal_designator for inits like
- // [4][foo bar].
+ // If we have exactly one array designator, this used the GNU
+ // 'designation: array-designator' extension, otherwise there should be no
+ // designators at all!
+ if (Desig) {
+ if (Desig->getNumDesignators() == 1 &&
+ (Desig->getDesignator(0).isArrayDesignator() ||
+ Desig->getDesignator(0).isArrayRangeDesignator()))
+ Diag(StartLoc, diag::ext_gnu_missing_equal_designator);
+ else
+ Diag(Tok, diag::err_expected_equal_designator);
+ }
+
IdentifierInfo *Name = Tok.getIdentifierInfo();
ConsumeToken();
return ParseAssignmentExprWithObjCMessageExprStart(StartLoc, Name, 0);
@@ -143,8 +153,19 @@ ParseInitializerWithPotentialDesignator(InitListDesignations &Designations,
// an assignment-expression production.
if (getLang().ObjC1 && Tok.isNot(tok::ellipsis) &&
Tok.isNot(tok::r_square)) {
- // FIXME: Emit ext_gnu_missing_equal_designator for inits like
- // [4][foo bar].
+
+ // If we have exactly one array designator, this used the GNU
+ // 'designation: array-designator' extension, otherwise there should be no
+ // designators at all!
+ if (Desig) {
+ if (Desig->getNumDesignators() == 1 &&
+ (Desig->getDesignator(0).isArrayDesignator() ||
+ Desig->getDesignator(0).isArrayRangeDesignator()))
+ Diag(StartLoc, diag::ext_gnu_missing_equal_designator);
+ else
+ Diag(Tok, diag::err_expected_equal_designator);
+ }
+
return ParseAssignmentExprWithObjCMessageExprStart(StartLoc, 0,Idx.Val);
}
OpenPOWER on IntegriCloud