[cfe-commits] Preliminary patch to support MSVC __declspec(property)

John McCall rjmccall at apple.com
Tue Apr 16 00:48:27 PDT 2013


On Apr 15, 2013, at 8:53 PM, endlessroad1991 at gmail.com wrote:
> Last problem:
>> 2. In Sema/SemaExpr.cpp, ActOnCallExpr():
>> I admit that I'm not very thorough about this one...
>> But here the CheckPlaceholderExpr() call does solve the follwing problem.
>> === Code Start ===
>> // If compiled with -ggdb, clang will crash and saying something about
>> // "unexpected builtin-type" in some CG code.
>> 
>> struct S2 {
>> 	template <class T>
>> 	void f(T t) {}
>> };
>> 
>> template <class T>
>> struct S
>> {
>> 	__declspec(property(get=GetV)) int V;
>> 	int GetV() { return 123; }
>> 	void f() { S2 s2; s2.f(V); }
>> };
>> 
>> int main() {
>> 	S<int> s;
>> 	s.f();
>> }
>> === Code End ===
> 
> Ah, I think the problem here is that overload resolution and especially
> template argument deduction aren't lowering out placeholder types.  Please
> hoist this loop out of the C++ block (for obscure reasons; just trust me)
> and check:
>   hasPlaceholderType(BuiltinType::PseudoObject)
> instead of checking for a particular expression kind.
> 
> And please add this as a test case. :)
> 
> This change leads to a test failure:
> test/SemaObjc/property-user-setter.m, Line 88:
> void g(int); // expected-note {{passing argument to parameter here}}
> this note is no longer printed.
> If it's fine, wen can just remove the expected-note comment, but I don't know if it's appropriate.

The note's not particularly important, no.  The context of initializing a parameter doesn't really have much to do with the failure to load the property.

This looked really good, so I spent a little time tweaking it and then committed it as r179585, thanks!

The main changes I made were:
  - I tweaked a lot of the diagnostic text to just talk about properties instead of saying __declspec(property).
  - I also changed the diagnostic names to make it clear that they were specific to MS properties.
  - I reworked the parsing code to avoid some redundant diagnostics and recover nicely in some ways.  For example, if you try to say set=setX, it'll tell you to write put=setX.
  - Properties have to be bare identifiers, so there is no point in storing a full DeclarationNameInfo;  it's always just a SourceLocation.

Please don't let the number of changes dishearten you;  it was all just small tweaks, and this was really great work!

Are you planning to work on subscriptable properties, or was this enough to get your project ported?

John.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130416/d2cd4b5a/attachment.html>


More information about the cfe-commits mailing list