mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-22 04:55:50 -04:00

expression Clang emits invalid protocol metadata when a @protocol expression is used with a forward-declared protocol. The protocol metadata is missing protocol conformance list of the protocol since we don't have access to the definition of it in the compiled translation unit. The linker then might end up picking the invalid metadata when linking which will lead to incorrect runtime protocol conformance checks. This commit makes sure that Clang fails to compile code that uses a @protocol expression with a forward-declared protocol. This ensures that Clang does not emit invalid protocol metadata. I added an extra assert in CodeGen to ensure that this kind of issue won't happen in other places. rdar://32787811 Differential Revision: https://reviews.llvm.org/D49462 llvm-svn: 340102
65 lines
2.3 KiB
Plaintext
65 lines
2.3 KiB
Plaintext
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wno-objc-root-class -Wno-incomplete-implementation -triple x86_64-apple-macosx10.10.0 -verify %s
|
|
|
|
// rdar://20626062
|
|
|
|
struct S {
|
|
int throw; // expected-error {{expected member name or ';' after declaration specifiers; 'throw' is a keyword in Objective-C++}}
|
|
};
|
|
|
|
@interface class // expected-error {{expected identifier; 'class' is a keyword in Objective-C++}}
|
|
@end
|
|
|
|
@interface Bar: class // expected-error {{expected identifier; 'class' is a keyword in Objective-C++}}
|
|
@end
|
|
|
|
@protocol P // ok
|
|
@end
|
|
|
|
@protocol new // expected-error {{expected identifier; 'new' is a keyword in Objective-C++}}
|
|
@end
|
|
|
|
@protocol P2;
|
|
@protocol delete // expected-error {{expected identifier; 'delete' is a keyword in Objective-C++}}
|
|
@end
|
|
|
|
@class Foo, try; // expected-error {{expected identifier; 'try' is a keyword in Objective-C++}}
|
|
|
|
@interface Foo
|
|
|
|
@property (readwrite, nonatomic) int a, b, throw; // expected-error {{expected member name or ';' after declaration specifiers; 'throw' is a keyword in Objective-C++}}
|
|
|
|
-foo:(int)class; // expected-error {{expected identifier; 'class' is a keyword in Objective-C++}}
|
|
+foo:(int)constexpr; // expected-error {{expected identifier; 'constexpr' is a keyword in Objective-C++}}
|
|
|
|
@end
|
|
|
|
@interface Foo () <P, new> // expected-error {{expected identifier; 'new' is a keyword in Objective-C++}}
|
|
@end
|
|
|
|
@implementation Foo
|
|
|
|
@synthesize a = _a; // ok
|
|
@synthesize b = virtual; // expected-error {{expected identifier; 'virtual' is a keyword in Objective-C++}}
|
|
|
|
@dynamic throw; // expected-error {{expected identifier; 'throw' is a keyword in Objective-C++}}
|
|
|
|
-foo:(int)class { // expected-error {{expected identifier; 'class' is a keyword in Objective-C++}}
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation class // expected-error {{expected identifier; 'class' is a keyword in Objective-C++}}
|
|
@end
|
|
|
|
@implementation Bar: class // expected-error {{expected identifier; 'class' is a keyword in Objective-C++}}
|
|
@end
|
|
|
|
@compatibility_alias C Foo; // ok
|
|
@compatibility_alias const_cast Bar; // expected-error {{expected identifier; 'const_cast' is a keyword in Objective-C++}}
|
|
@compatibility_alias C2 class; // expected-error {{expected identifier; 'class' is a keyword in Objective-C++}}
|
|
|
|
void func() {
|
|
(void)@protocol(P); // ok
|
|
(void)@protocol(delete); // expected-error {{expected identifier; 'delete' is a keyword in Objective-C++}}
|
|
}
|