diff options
author | Chris Lattner <sabre@nondot.org> | 2008-10-26 23:29:41 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-10-26 23:29:41 +0000 |
commit | 9a53fdc23ecdd74ae801ffa4acbf6b548fb291d4 (patch) | |
tree | d110afa034a21fc346e6af035a9cf42b1473c7b1 /clang/lib/Parse/ParseInit.cpp | |
parent | 46dcba6d2d2ef444a7119a27943ec2988076796a (diff) | |
download | bcm5719-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.cpp | 29 |
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); } |