Bug 18474 - Unary plus/minus lvalueness not diagnosed in templates
Summary: Unary plus/minus lvalueness not diagnosed in templates
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.0.0
: P2 normal
Target Milestone: 14.0
Assignee: Patrick Palka
URL:
Keywords: accepts-invalid, diagnostic
Depends on:
Blocks:
 
Reported: 2004-11-14 10:50 UTC by Giovanni Bajo
Modified: 2023-09-22 20:00 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2021-07-26 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Giovanni Bajo 2004-11-14 10:50:52 UTC
-------------------------------------
template <int>
void g(void)
{
  -n = 0;        // { dg-error "non-lvalue" "" { xfail *-*-* } }
  +n = 0;        // { dg-error "non-lvalue" "" { xfail *-*-* } }
}
-------------------------------------

This should be rejected but does not (until instantiation).
Comment 1 Andrew Pinski 2004-11-14 17:18:29 UTC
Confirmed. Note the testcase is not full you have to have a declaration for n.
Comment 2 Andrew Pinski 2022-12-07 02:53:37 UTC
Note this is only invalid as n (if declared correctly) was not depedent so the operator lookup would be bound at definition time.

That is the following needs to be accepted still:
template <class T>
void g(void)
{
  T n;
  -n = 0;
  +n = 0;
}
Comment 3 GCC Commits 2023-09-18 18:48:10 UTC
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>:

https://gcc.gnu.org/g:6e92a6a2a72d3b7a5e1b29042d8a6a43fe1085aa

commit r14-4111-g6e92a6a2a72d3b7a5e1b29042d8a6a43fe1085aa
Author: Patrick Palka <ppalka@redhat.com>
Date:   Mon Sep 18 14:47:52 2023 -0400

    c++: non-dependent assignment checking [PR63198, PR18474]
    
    This patch makes us recognize and check non-dependent simple assigments
    ahead of time, like we already do for compound assignments.  This means
    the templated representation of such assignments will now usually have
    an implicit INDIRECT_REF (due to the reference return type), which the
    -Wparentheses code needs to handle.  As a drive-by improvement, this
    patch also makes maybe_convert_cond issue -Wparentheses warnings ahead
    of time, and removes a seemingly unnecessary suppress_warning call in
    build_x_modify_expr.
    
    On the libstdc++ side, some tests were attempting to modify a data
    member from a uninstantiated const member function, which this patch
    minimally fixes by making the data member mutable.
    
            PR c++/63198
            PR c++/18474
    
    gcc/cp/ChangeLog:
    
            * semantics.cc (maybe_convert_cond): Look through implicit
            INDIRECT_REF when deciding whether to issue a -Wparentheses
            warning, and consider templated assignment expressions as well.
            (finish_parenthesized_expr): Look through implicit INDIRECT_REF
            when suppressing -Wparentheses warning.
            * typeck.cc (build_x_modify_expr): Check simple assignments
            ahead time too, not just compound assignments.  Give the second
            operand of MODOP_EXPR a non-null type so that it's not considered
            always instantiation-dependent.  Don't call suppress_warning.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp0x/static_assert15.C: Expect diagnostic for
            non-constant static_assert condition.
            * g++.dg/expr/unary2.C: Remove xfails.
            * g++.dg/template/init7.C: Make initializer type-dependent to
            preserve intent of test.
            * g++.dg/template/recurse3.C: Likewise for the erroneous
            statement.
            * g++.dg/template/non-dependent26.C: New test.
            * g++.dg/warn/Wparentheses-32.C: New test.
    
    libstdc++-v3/ChangeLog:
    
            * testsuite/26_numerics/random/discard_block_engine/cons/seed_seq2.cc:
            Make data member seed_seq::called mutable.
            * testsuite/26_numerics/random/independent_bits_engine/cons/seed_seq2.cc:
            Likewise.
            * testsuite/26_numerics/random/linear_congruential_engine/cons/seed_seq2.cc:
            Likewise.
            * testsuite/26_numerics/random/mersenne_twister_engine/cons/seed_seq2.cc:
            Likewise.
            * testsuite/26_numerics/random/shuffle_order_engine/cons/seed_seq2.cc:
            Likewise.
            * testsuite/26_numerics/random/subtract_with_carry_engine/cons/seed_seq2.cc:
            Likewise.
            * testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/seed_seq2.cc:
            Likewise.
Comment 4 Patrick Palka 2023-09-18 19:13:12 UTC
Fixed for GCC 14.