Parentheses around address non-type template argument is demoted to an extension warning.
llvm-svn: 113739
This commit is contained in:
parent
8830091a1a
commit
6a0c4097f1
|
@ -1437,8 +1437,8 @@ def err_template_arg_not_object_or_func : Error<
|
|||
"non-type template argument does not refer to an object or function">;
|
||||
def err_template_arg_not_pointer_to_member_form : Error<
|
||||
"non-type template argument is not a pointer to member constant">;
|
||||
def err_template_arg_extra_parens : Error<
|
||||
"non-type template argument cannot be surrounded by parentheses">;
|
||||
def ext_template_arg_extra_parens : ExtWarn<
|
||||
"address non-type template argument cannot be surrounded by parentheses">;
|
||||
def err_pointer_to_member_type : Error<
|
||||
"invalid use of pointer to member type after %select{.*|->*}0">;
|
||||
|
||||
|
|
|
@ -2410,13 +2410,15 @@ CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S,
|
|||
// corresponding template-parameter is a reference; or
|
||||
DeclRefExpr *DRE = 0;
|
||||
|
||||
// Ignore (and complain about) any excess parentheses.
|
||||
// In C++98/03 mode, give an extension warning on any extra parentheses.
|
||||
// See http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#773
|
||||
bool ExtraParens = false;
|
||||
while (ParenExpr *Parens = dyn_cast<ParenExpr>(Arg)) {
|
||||
if (!Invalid) {
|
||||
if (!Invalid && !ExtraParens && !S.getLangOptions().CPlusPlus0x) {
|
||||
S.Diag(Arg->getSourceRange().getBegin(),
|
||||
diag::err_template_arg_extra_parens)
|
||||
diag::ext_template_arg_extra_parens)
|
||||
<< Arg->getSourceRange();
|
||||
Invalid = true;
|
||||
ExtraParens = true;
|
||||
}
|
||||
|
||||
Arg = Parens->getSubExpr();
|
||||
|
@ -2658,13 +2660,15 @@ bool Sema::CheckTemplateArgumentPointerToMember(Expr *Arg,
|
|||
// -- a pointer to member expressed as described in 5.3.1.
|
||||
DeclRefExpr *DRE = 0;
|
||||
|
||||
// Ignore (and complain about) any excess parentheses.
|
||||
// In C++98/03 mode, give an extension warning on any extra parentheses.
|
||||
// See http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#773
|
||||
bool ExtraParens = false;
|
||||
while (ParenExpr *Parens = dyn_cast<ParenExpr>(Arg)) {
|
||||
if (!Invalid) {
|
||||
if (!Invalid && !ExtraParens && !getLangOptions().CPlusPlus0x) {
|
||||
Diag(Arg->getSourceRange().getBegin(),
|
||||
diag::err_template_arg_extra_parens)
|
||||
diag::ext_template_arg_extra_parens)
|
||||
<< Arg->getSourceRange();
|
||||
Invalid = true;
|
||||
ExtraParens = true;
|
||||
}
|
||||
|
||||
Arg = Parens->getSubExpr();
|
||||
|
|
|
@ -53,7 +53,7 @@ namespace pointer_to_object_parameters {
|
|||
A2<X_ptr> *a12; // expected-error{{must have its address taken}}
|
||||
A2<array_of_Xs> *a13;
|
||||
A2<&an_X> *a13_2;
|
||||
A2<(&an_X)> *a13_3; // expected-error{{non-type template argument cannot be surrounded by parentheses}}
|
||||
A2<(&an_X)> *a13_3; // expected-warning{{address non-type template argument cannot be surrounded by parentheses}}
|
||||
|
||||
// PR6244
|
||||
struct X1 {} X1v;
|
||||
|
|
|
@ -87,7 +87,7 @@ template<int Z::*pm> struct A7c;
|
|||
A7<&Z::int_member> *a18_1;
|
||||
A7c<&Z::int_member> *a18_2;
|
||||
A7<&Z::float_member> *a18_3; // expected-error{{non-type template argument of type 'float Z::*' cannot be converted to a value of type 'int Z::*'}}
|
||||
A7c<(&Z::int_member)> *a18_3; // expected-error{{non-type template argument cannot be surrounded by parentheses}}
|
||||
A7c<(&Z::int_member)> *a18_4; // expected-warning{{address non-type template argument cannot be surrounded by parentheses}}
|
||||
|
||||
template<unsigned char C> struct Overflow; // expected-note{{template parameter is declared here}}
|
||||
|
||||
|
|
Loading…
Reference in New Issue