backport: re PR c++/52521 ([C++11] user defined literals and order of declaration)

Backported from mainline
	2012-03-14  Jakub Jelinek  <jakub@redhat.com>

	PR c++/52521
	* parser.c (lookup_literal_operator): Return fn only if
	processed all arguments from args vector and argtypes is
	void_list_node.

	* g++.dg/cpp0x/udlit-args2.C: New test.

From-SVN: r185683
This commit is contained in:
Jakub Jelinek 2012-03-22 11:10:24 +01:00 committed by Jakub Jelinek
parent ab843994bf
commit d6b0165ded
4 changed files with 38 additions and 2 deletions

View File

@ -1,3 +1,13 @@
2012-03-22 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2012-03-14 Jakub Jelinek <jakub@redhat.com>
PR c++/52521
* parser.c (lookup_literal_operator): Return fn only if
processed all arguments from args vector and argtypes is
void_list_node.
2012-03-22 Release Manager
* GCC 4.7.0 released.

View File

@ -1,6 +1,6 @@
/* C++ Parser.
Copyright (C) 2000, 2001, 2002, 2003, 2004,
2005, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
2005, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
Written by Mark Mitchell <mark@codesourcery.com>.
This file is part of GCC.
@ -3581,7 +3581,13 @@ lookup_literal_operator (tree name, VEC(tree,gc) *args)
TREE_TYPE (tparm))))
found = false;
}
if (found)
if (found
&& ix == VEC_length (tree, args)
/* May be this should be sufficient_parms_p instead,
depending on how exactly should user-defined literals
work in presence of default arguments on the literal
operator parameters. */
&& argtypes == void_list_node)
return fn;
}
}

View File

@ -1,6 +1,11 @@
2012-03-22 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2012-03-14 Jakub Jelinek <jakub@redhat.com>
PR c++/52521
* g++.dg/cpp0x/udlit-args2.C: New test.
2012-03-13 Jakub Jelinek <jakub@redhat.com>
PR c/52577

View File

@ -0,0 +1,15 @@
// PR c++/52521
// { dg-do compile }
// { dg-options -std=c++11 }
#include <cstddef>
int operator "" _a (const char *);
int operator "" _a (const char *, std::size_t);
int a = 123_a;
int a2 = "abc"_a;
int operator "" _b (const char *, std::size_t);
int operator "" _b (const char *);
int b = 123_b;
int b2 = "abc"_b;