[aspectc-user] referencing nested classes in exception specification

Panu Bloigu panu.bloigu at gmail.com
Wed Jan 2 15:19:44 CET 2008


Hello.

I have run across a problem with compiling the following three files. I
have tested this with both 1.0pre3 and an SVN version checked out today.


=============================================
File: ExcepTest.h
=============================================
1:    class ExcepTest
2:    {
3:    public:
4:            ExcepTest();
5:            virtual ~ExcepTest();
6:            class Exception{};
7:            void method() throw (Exception);
8:    };
=============================================

=============================================
File: ExcepTest.cpp
=============================================
1:    #include "ExcepTest.h"
2:    ExcepTest::ExcepTest(){}
3:
4:    ExcepTest::~ExcepTest(){}
5:
6:    void ExcepTest::method() throw (Exception)
7:    {
8:            throw new Exception();
9:    }
=============================================

=============================================
File: main.cpp
=============================================
1:    #include "ExcepTest.h"
2:    int main()
3:    {
4:            ExcepTest et;
5:            return 0;
6:    }
=============================================



When I issue the command (with 1.0pre3):
=============================================
ag++ -k -v9 --keep_acc ExcepTest.cpp main.cpp -o main
=============================================

the compiler woes:
=============================================
*
*
* AG++ Configuration:
*   Create puma.config: 1
*   Aspect C++ weaver:  ac++
*   C++ compiler:       g++
*   Files:               ExcepTest.cpp main.cpp
*   Options (G++):       -v -I"." -I"."
*   Options (AC++):      -k -v9 -p.
*   Options (total):     -k -v9 -v ExcepTest.cpp -I"." main.cpp -I"." -p.
*   Weave: 1 Compile: 1 Link: 1
*
*
* Generating Puma configuration file
    - Parsing output of g++ compiler
    - Executing: "g++"  -v -I"." -I"." -E -dM -v -x c++ "/dev/null"
2>ExcepTest.cpp.err.out 1>ExcepTest.cpp.std.out
    - Exit: Success
    - removing temporary file: ExcepTest.cpp.std.out
    - removing temporary file: ExcepTest.cpp.err.out
    - Writing puma configuration file
* Weaving
    - Executing: "ac++" --config "puma.config"  -k -v9 -p. -c
"ExcepTest.cpp" -o "ExcepTest.acc"
* Running ac++ 1.0pre3
* Handling Translation Unit `ExcepTest.cpp'.
    - Path "ExcepTest.cpp"
    - Inserting namespace AC
    - Parsing ...
ExcepTest.cpp:6: error: invalid declaration near token `Exception'
    - Aborting
error: Execution failed: "ac++" --config "puma.config"  -k -v9 -p. -c
"ExcepTest.cpp" -o "ExcepTest.acc"
    - Exitcode: 256 (should be 0 )

=============================================


With g++ this compiles fine. I have tried compiling this also in Eclipse
with the latest ACDT.

Note, however, that if I change the exception specification of the
method ExcepTest::method in the file ExcepTest.cpp so that it references
the inner class Exception with it's fully qualified name, the
compilation goes fine. In other words, if the line 6 in the file
ExcepTest.cpp reads 'void ExcepTest::method() throw
(ExcepTest::Exception)', the compilation succeeds.

Why doesn't ac++ allow referencing a nested type in the exception
specification if g++ does? Is it against the C++ Standard? Also note
that if I define the method ExcepTest::method in the header file, then
the fully qualified name is not needed in the exception specification.


--Panu.



More information about the aspectc-user mailing list