ebevhan added a comment.

I think the solution to a lot of diagnostic and behavior issues with address 
spaces is to remove predication on OpenCL. It's a bit odd to have a language 
feature that is enabled out of the box regardless of langoptions (address 
spaces) but won't actually work properly unless you're building OpenCL.



================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:6943
+def err_typecheck_incompatible_conditional_pointer_operands : Error<
+  "unable to find common type between %0 and %1 for conditional operation">;
 
----------------
This error is very similar to the one in my first comment, `conditional 
operator with the second and third operands of type 
('__attribute__((address_space(1))) char *' and 
'__attribute__((address_space(2))) char *') which are pointers to 
non-overlapping address spaces`. It would normally be emitted at 6472, but 
won't be since OpenCL isn't enabled.


================
Comment at: test/Sema/conditional-expr.c:78
+                       // expected-error@-1{{converting 
'__attribute__((address_space(2))) int *' to type 'void *' changes address 
space of pointer}}
+                       // expected-error@-2{{converting 
'__attribute__((address_space(3))) int *' to type 'void *' changes address 
space of pointer}}
 
----------------
rjmccall wrote:
> leonardchan wrote:
> > rjmccall wrote:
> > > Also, these diagnostics seem wrong.  Where is `void *` coming from?
> > When dumping the AST this is what the resulting type is for the conditional 
> > expression already is if the operands are 2 pointers with different address 
> > spaces.
> > 
> > According to this comment, the reason seems to be because this is what GCC 
> > does:
> > 
> > ```
> >  6512     // In this situation, we assume void* type. No especially good
> >  6513     // reason, but this is what gcc does, and we do have to pick
> >  6514     // to get a consistent AST.
> > ```
> That makes sense in general, but in this case it's not a great diagnostic; we 
> should just emit an error when trying to pick a common type.
Is it possible that you are getting `void *` because we aren't running the 
qualifier removal at 6495? I don't think I've ever seen spurious `void *`'s 
show up in our downstream diagnostics.


Repository:
  rC Clang

https://reviews.llvm.org/D50278



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to