mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-14 03:29:57 +00:00
When forming a cycle in objc's inheritance hierarchy,
diagnose it properly and don't throw clang into an infinit loop. // rdar://9653341 llvm-svn: 133773
This commit is contained in:
parent
9d2f340249
commit
3ee91fad90
@ -330,6 +330,8 @@ def err_duplicate_class_def : Error<
|
||||
"duplicate interface definition for class %0">;
|
||||
def err_undef_superclass : Error<
|
||||
"cannot find interface declaration for %0, superclass of %1">;
|
||||
def err_forward_superclass : Error<
|
||||
"attempting to use the forward class %0 as superclass of %1">;
|
||||
def err_no_nsconstant_string_class : Error<
|
||||
"cannot find interface declaration for %0">;
|
||||
def err_recursive_superclass : Error<
|
||||
|
@ -491,10 +491,13 @@ ActOnStartClassInterface(SourceLocation AtInterfaceLoc,
|
||||
if (!SuperClassDecl)
|
||||
Diag(SuperLoc, diag::err_undef_superclass)
|
||||
<< SuperName << ClassName << SourceRange(AtInterfaceLoc, ClassLoc);
|
||||
else if (SuperClassDecl->isForwardDecl())
|
||||
Diag(SuperLoc, diag::err_undef_superclass)
|
||||
else if (SuperClassDecl->isForwardDecl()) {
|
||||
Diag(SuperLoc, diag::err_forward_superclass)
|
||||
<< SuperClassDecl->getDeclName() << ClassName
|
||||
<< SourceRange(AtInterfaceLoc, ClassLoc);
|
||||
Diag(SuperClassDecl->getLocation(), diag::note_forward_class);
|
||||
SuperClassDecl = 0;
|
||||
}
|
||||
}
|
||||
IDecl->setSuperClass(SuperClassDecl);
|
||||
IDecl->setSuperClassLoc(SuperLoc);
|
||||
|
@ -23,9 +23,9 @@
|
||||
|
||||
@interface E2 <p1,p2,p3> @end // expected-warning {{cannot find protocol definition for 'p3'}}
|
||||
|
||||
@class U1, U2;
|
||||
@class U1, U2; // expected-note {{forward class is declared here}}
|
||||
|
||||
@interface E3 : U1 @end // expected-error {{cannot find interface declaration for 'U1', superclass of 'E3'}}
|
||||
@interface E3 : U1 @end // expected-error {{attempting to use the forward class 'U1' as superclass of 'E3'}}
|
||||
|
||||
|
||||
@interface I3 : E3 @end
|
||||
|
@ -1,9 +1,9 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
@class FOO, BAR;
|
||||
@class FOO, BAR; // expected-note {{forward class is declared here}}
|
||||
@class FOO, BAR;
|
||||
|
||||
@interface INTF : FOO // expected-error {{cannot find interface declaration for 'FOO', superclass of 'INTF'}}
|
||||
@interface INTF : FOO // expected-error {{attempting to use the forward class 'FOO' as superclass of 'INTF'}}
|
||||
@end
|
||||
|
||||
@interface FOO
|
||||
@ -45,3 +45,14 @@ typedef NSObject <XCElementP> XCElement;
|
||||
@end
|
||||
|
||||
|
||||
// rdar://9653341
|
||||
@class B; // expected-note {{forward class is declared here}}
|
||||
@interface A : B {} // expected-error {{attempting to use the forward class 'B' as superclass of 'A'}}
|
||||
@end
|
||||
|
||||
@interface B : A {}
|
||||
@end
|
||||
|
||||
@implementation A @end
|
||||
@implementation B @end
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
@class SUPER, Y;
|
||||
@class SUPER, Y; // expected-note 2 {{forward class is declared here}}
|
||||
|
||||
@interface INTF :SUPER // expected-error {{cannot find interface declaration for 'SUPER', superclass of 'INTF'}}
|
||||
@interface INTF :SUPER // expected-error {{attempting to use the forward class 'SUPER' as superclass of 'INTF'}}
|
||||
@end
|
||||
|
||||
@interface SUPER @end
|
||||
@ -13,7 +13,7 @@
|
||||
@interface INTF2 : INTF1
|
||||
@end
|
||||
|
||||
@interface INTF3 : Y // expected-error {{cannot find interface declaration for 'Y', superclass of 'INTF3'}} \
|
||||
@interface INTF3 : Y // expected-error {{attempting to use the forward class 'Y' as superclass of 'INTF3'}} \
|
||||
// expected-note{{'INTF3' declared here}}
|
||||
@end
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user