https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92640
Bug ID: 92640
Summary: Incorrect warning: exception of type 'const derived&'
will be caught by earlier handler for 'const base&'
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: jorrit at jorrit dot de
Target Milestone: ---
In the following program, the catch-clause for `derived` is taken, since
`derived` is derived privately from `base`. However, the compiler still emits
a warning that the catch clause for `derived` will nether be taken.
Compiled without any particular options.
> struct base {};
> class derived : base {};
>
> template<class>
> int check()
> {
> try {
> throw derived();
> }
> catch(const base &) { return 0; }
> catch(const derived &) { return 1; }
> }
>
> int main()
> {
> return check<int>();
> }
Compiler stderr
> <source>: In function 'int check()':
> <source>:11:3: warning: exception of type 'const derived&' will be caught
> 11 | catch(const derived &) { return 1; }
> | ^~~~~
> <source>:10:3: warning: by earlier handler for 'const base&'
> 10 | catch(const base &) { return 0; }
> | ^~~~~
The program exits with 1 when run, contradicting the compiler warning.
Could reproduce with the following version on godbolt,
https://godbolt.org/z/jerjHS:
- current trunk: g++ (Compiler-Explorer-Build) 10.0.0 20191122 (experimental)
- g++ (Compiler-Explorer-Build) 9.2.0
- g++ (Compiler-Explorer-Build) 8.3.0
- g++ (Compiler-Explorer-Build) 7.5.0
Note: this may or may not be a dup of Bug 69373. Though here it is not
(function) pointers, and only happens with the catch clauses inside a template
function.