Bug 53421 - __attribute__((__may_alias__)) prevents taking address of conversion operator member function
Summary: __attribute__((__may_alias__)) prevents taking address of conversion operator...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.6.3
: P3 normal
Target Milestone: 6.0
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-05-19 20:29 UTC by Jeffrey Lee Hellrung, Jr.
Modified: 2015-08-13 15:46 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
source file exhibiting the bug when compiled (254 bytes, text/x-c++src)
2012-05-19 20:29 UTC, Jeffrey Lee Hellrung, Jr.
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Jeffrey Lee Hellrung, Jr. 2012-05-19 20:29:30 UTC
Created attachment 27446 [details]
source file exhibiting the bug when compiled

Compiling attached main.cpp gives the following error:

jeffrey@ubuntu:~/scratch$ g++ -o scratch main.cpp
main.cpp: In function ‘int main(int, char**)’:
main.cpp:21:6: error: ‘operator Y<X>&’ is not a member of ‘X’

However, no error occurs with any of the following changes:
(a) Removing the __attribute__((__may_alias__)) (commenting in line 3 and commenting out line 4).
(b) Removing the implementation (line 8) or using a throwing implementation (line 9) rather than the present implementation (line 10).
(c) Replacing the conversion operator with a regular member function (commenting out lines 10,21 and commenting in lines 11,22 or 12,22.

Further investigation reveals a possibly related error. One can define the function out-of-line (commenting in lines 8,16 and commenting out line 10) with no error, as long as line 15 remains commented out; additionally commenting in line 15 gives the following error:

jeffrey@ubuntu:~/scratch$ g++ -o scratch main.cpp
main.cpp:16:20: error: no ‘X::operator Y<X>&()’ member function declared in class ‘X’

This error still appears if one uses a throwing implementation (like in (b)) or replaces the conversion operator with a regular member function (like in (c)), but no error occurs with the removal of the __attribute__((__may_alias__)) (as in (a)).
Comment 1 Paolo Carlini 2015-08-13 15:34:03 UTC
This is fixed in mainline. I'm adding two testcases and closing the bug.
Comment 2 paolo@gcc.gnu.org 2015-08-13 15:46:09 UTC
Author: paolo
Date: Thu Aug 13 15:45:37 2015
New Revision: 226868

URL: https://gcc.gnu.org/viewcvs?rev=226868&root=gcc&view=rev
Log:
2015-08-13  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/53421
	* g++.dg/ext/attribute-may-alias-1.C: New.
	* g++.dg/ext/attribute-may-alias-2.C: Likewise.

Added:
    trunk/gcc/testsuite/g++.dg/ext/attribute-may-alias-1.C
    trunk/gcc/testsuite/g++.dg/ext/attribute-may-alias-2.C
Modified:
    trunk/gcc/testsuite/ChangeLog
Comment 3 Paolo Carlini 2015-08-13 15:46:30 UTC
Done.